参考文献:
JAVA8实战
Java 8 中的 Streams API 详解
Java8初体验(二)Stream语法详解
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
//转换大写
List output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());
//平方数
List nums = Arrays.asList(1, 2, 3, 4);
List squareNums = nums.stream().
map(n -> n * n).
collect(Collectors.toList());
//一对多
Stream> inputStream = Stream.of(
Arrays.asList(1),
Arrays.asList(2, 3),
Arrays.asList(4, 5, 6));
Stream outputStream = inputStream.
flatMap((childList) -> childList.stream());
map示意图
flatmap示意图
filter: filter 对原始 Stream 进行某项筛选,通过筛选的元素被留下来生成一个新 Stream。
//留下偶数
Integer[] sixNums = {1, 2, 3, 4, 5, 6};
Integer[] evens =Stream.of(sixNums).filter(n -> n%2 == 0)
.toArray(Integer[]::new);
forEach:
//打印出所有男性员工的姓名
roster.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.forEach(p -> System.out.println(p.getName()));
reduce(归纳/汇聚): 这个方法的主要作用是把 Stream元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce。
// 字符串连接,concat = "ABCD"
String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat);
// 求最小值,minValue = -3.0
double minValue = Stream.of(-1.5, 1.0, -3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
// 求和,sumValue = 10, 有起始值
int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
// 求和,sumValue = 10, 无起始值
sumValue = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
// 过滤,字符串连接,concat = "ace"
concat = Stream.of("a", "B", "c", "D", "e", "F").
filter(x -> x.compareTo("Z") > 0).
reduce("", String::concat);
sorted(排序):
//2012年所发生的交易额排序
List transactions = (List) lists.stream()
.filter(transaction -> transaction.getYear() == 2012)
.sorted(Comparator.comparing(Transaction::getValue)).collect(Collectors.toList());
参考文献:
JAVA8实战
Java 8 中的 Streams API 详解
Java8初体验(二)Stream语法详解