JDK 1.8中关于Stream接口的一些易混淆点
parallelStream:
Collection的
stream方法会返回串行流,而parallelStream会返回并行流,并行流在处理简单数据时效率较高,其底层通过fork/join实现,
会牵扯到多线程的复杂性问题。
并行流使用的线程数目可以通过jvm启动参数进行配置,一个不好的并行流会阻塞其他并行流,使之在运行时成为串行。
flatMap:
Stream的
map方法和flatMap方法的入参都是Function接口,flatMap规定了接口的第二个泛型必须继承Stream,
map方法返回一个 Function接口返回的对象 所组成的Stream,
flatMap返回一个将 Function接口返回的Stream对象 中所包含的每个对象全部装载进去的合并的Stream
peek:
Returns a stream consisting of the elements of this stream, additionally performing
the provided action on each element
as elements are consumed from the resulting stream.
返回一个包含当前stream中所有元素的stream,并且会在返回的元素被消费时进行函数所给定的操作。
reduce:
一个入参的方法(BinaryOperator<T> accumulator),
返回值为Optional<T>,等同于
boolean foundAny = false;
T result = null;
for (T element : this stream) {
if (!foundAny) {
foundAny = true;
result = element;
}
else
result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();
两个入参的方法(T identity,BinaryOperator<T> accumulator),
返回值为泛型为T的值,该方法等同于
T result = identity;
for (T element : this stream)
result = accumulator.apply(result, element)
return result;
三个入参的reduce方法,
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);
允许返回与当前流中数据类型不同的值,计算过程由第二个参数控制,计算方式类似单参的reduce方法,
三参reduce方法中的第三个参数用于在并行流parallelStream中合并并行计算的结果。
以上内容大多来自对jdk原码注释的理解翻译