一.collectbash
1.collect:收集器app
2.Collector做爲collect方法的參數ide
3.Collector是一種接口,它是一個可變的匯聚操做,將輸入元素累積到一個可變的結果容器中,它會在全部元素都處理完畢後,將累積的結果轉換爲一個最終的表示(這是一個可選操做);它支持串行與並行兩種方式執行函數
4.Collectors自己提供了關於Collector的常見匯聚實現,Collectors自己其實是一個工廠spa
5.Collector裏有三個參數類型T,A,R(後續作補充)
code
6.Collector裏面有四種參數方法排序
supplier,accumulator,combiner,finisher,在這裏先主要寫supplier和accumulator.接口
二. supplierci
建立並返回一個可變結果容器;Supplier接口不接受參數並返回一個結果。get
Supplier<A> supplier();複製代碼
三.accumulator
將新的數據元素(包括集合)給合併到一個結果容器(將值給摺疊到一個可變的結果容器當中,這個可變容器能夠是輸入元素中的的第一個元素(集合)也能夠是新的集合)
BiConsumer接口 接受兩個參數不返回值
BiConsumer<A,T> accumulator();複製代碼
四.combiner
將兩個結果容器給合併成一個
BinaryOperator接口 接受兩個參數返回一個接果 這三個值爲同類型
BinaryOperator<A> combiner();複製代碼
五.finisher
對容器執行一個可選的最終轉換
Function接口接受一個參數返回一個結果 兩個值不是同類型
Function<A,R> finisher複製代碼
六.統一性和結合性
爲了保證串行流和並行流操做結果的等價性,須要collect函數知足兩個條件,identity(同一性)和associativity(結合性)
identity:針對於任何部分累積的結果中,將它與一個空的中間容器的合併時,獲得的結果與部分累積的結果一致(a== combiner.apply(a,supplier.get()))
(List<String>list1,List<String>list2) ->(list1.addAll(list2); return list1)
associativity:並行流分區分割計算的結果與串行流計算的結果也是同樣的
針對與有序的collect 只要保證finisher.apply(a1).equals(finisher.apply(a2))是正確的就知足告終合性,若是是無序的collect,其中對於該規則就要求沒那麼嚴格,只要求他們具備相同的元素,而忽略了元素的排序。
reduce:對於集合裏的操做的元素是不可變的,在串行流操做是沒有影響,而在並行流使用時結果會出錯(之後作詳細補充)
collect:對於集合裏的操做的元素是可變的
七.Collector的參數類型
庫基於Collector實現了reduction,須要遵照如下約束
Collector<T,A,R>
T:流操做中每個參數的類型
A:累積中間操做生成的結果類型
R:匯聚操做的結果類型