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