jdk8源碼 collect

一.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:匯聚操做的結果類型

相關文章
相關標籤/搜索