Collectors.collectingAndThen()
Java 8 流的新類 java.util.stream.Collectors 實現了 java.util.stream.Collector 接口,同時又提供了大量的方法對流 ( stream ) 的元素執行 map and reduce 操作,或者統計操作。
Collectors.collectingAndThen() 函數應該最像 map and reduce 了,它可接受兩個參數,第一個參數用於 reduce操作,而第二參數用於 map操作。
也就是,先把流中的所有元素傳遞給第二個參數,然后把生成的集合傳遞給第一個參數來處理。
例如下面的代碼
把 [1,2,3,4] 這個集合傳遞給 v -> v * 2 lambda表達式,計算得出結果為[2,4,6,8]
然后再把 [2,4,6,8]傳遞給 Collectors.averagingLong 表達式,計算得出 5.0
然后傳遞給 s -> s * s lambda表達式,計算得到結果為 25.0
collectingAndThenExample測試
@Test public void collectingAndThenExample() { List<Integer> list = Arrays.asList(1, 2, 3, 4); Double result = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingLong(v -> { System.out.println("v--" + v + "--> " + v * 2); return v * 2; }), s -> { System.out.println("s--" + s + "--> " + s * s); return s * s; })); System.out.println(result); }
collectingAndThenExample結果
v--1--> 2
v--2--> 4
v--3--> 6
v--4--> 8
s--5.0--> 25.0
25.0
一點嘮叨:
相對於Collectors.averagingDouble()來說,方法體只執行一次。
相對於Collectors.averagingDouble()來說,方法體做出了優化
相對於Collectors.averagingDouble()來說,這個沒有坑
……
為什么這么提Collectors.averagingDouble(),最好看一下—> averagingDouble
因為Collectors.averagingDouble()有坑,有坑,有坑