用 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-每個處理器可以減少流的一部分,並且結合每個處理器的結果進行減少。