用 Stresh 减少
减少是将二元运算符应用于流的每个元素以产生一个值的过程。
IntStream
的 sum()
方法是一个减少的例子; 它将加法应用于 Stream 的每个术语,从而产生一个最终值:
这相当于 (((1+2)+3)+4)
Stream 的 reduce
方法允许创建自定义缩减。可以使用 reduce
方法来实现 sum()
方法:
IntStream istr;
//Initialize istr
OptionalInt istr.reduce((a,b)->a+b);
返回 Optional
版本,以便可以正确处理空 Streams。
另一个减少的例子是将 Stream<LinkedList<T>>
组合成一个 LinkedList<T>
:
Stream<LinkedList<T>> listStream;
//Create a Stream<LinkedList<T>>
Optional<LinkedList<T>> bigList = listStream.reduce((LinkedList<T> list1, LinkedList<T> list2)->{
LinkedList<T> retList = new LinkedList<T>();
retList.addAll(list1);
retList.addAll(list2);
return retList;
});
你还可以提供标识元素。例如,添加的标识元素为 0,如 x+0==x
。对于乘法,identity 元素为 1,如 x*1==x
。在上面的例子中,identity 元素是一个空的 LinkedList<T>
,因为如果你将一个空列表添加到另一个列表,你正在添加的列表不会改变:
Stream<LinkedList<T>> listStream;
//Create a Stream<LinkedList<T>>
LinkedList<T> bigList = listStream.reduce(new LinkedList<T>(), (LinkedList<T> list1, LinkedList<T> list2)->{
LinkedList<T> retList = new LinkedList<T>();
retList.addAll(list1);
retList.addAll(list2);
return retList;
});
请注意,当提供标识元素时,返回值不会包含在 Optional
中 - 如果在空流上调用,则 reduce()
将返回标识元素。
二元运算符也必须是关联的,这意味着 (a+b)+c==a+(b+c)
。这是因为元素可以按任何顺序减少。例如,上面的添加减少可以像这样执行:
这种减少相当于写作 ((1+2)+(3+4))
。关联性也允许 Java 并行地减少 Stream
-每个处理器可以减少流的一部分,并且结合每个处理器的结果进行减少。