用 Stresh 减少

减少是将二元运算符应用于流的每个元素以产生一个值的过程。

IntStreamsum() 方法是一个减少的例子; 它将加法应用于 Stream 的每个术语,从而产生一个最终值: StackOverflow 文档

这相当于 (((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)。这是因为元素可以按任何顺序减少。例如,上面的添加减少可以像这样执行:

StackOverflow 文档

这种减少相当于写作 ((1+2)+(3+4))。关联性也允许 Java 并行地减少 Stream-每个处理器可以减少流的一部分,并且结合每个处理器的结果进行减少。