java8學習總結 Collector介面

2021-08-13 14:29:58 字數 2086 閱讀 6978

概述

在jdk中對collector的定義是乙個可變的歸約操作(a mutable reduction operation)。是一種操作思想,分為計算元素、歸集計算結果兩個主要的步驟;為了儲存計算元素的中間狀態,所以會提供乙個容器來完成中間狀態和中間結果的儲存。如下面的集合操作:

public class collecortest 

mapmap = new hashmap();

for (string element : container)

}}

在collector介面提供四個方法:

/**

* 1、 suppliersupplier();--> 不接受引數,返回乙個值。充當提供容器的角色

* 2、 biconsumeraccumulator();--> 接收兩個引數,不返回結果。其接收的兩個引數,第乙個是supplier提供的集合;第二個引數是待操作的元素,將元素操作完之後,放入集合中。

* 3、 binaryoperatorcombiner(); --> 這個方法主要是應對併發操作時,會出現多個中間容器,需要通過conbiner方法將多個中間結果容器進行合併,因為在finnish中只會接收乙個引數。如果不需要合併,則不會執行conbiner方法

* 4、 functionfinishaer(); --> 接收乙個引數,返回乙個值。這是最後的歸集操作,方法接收的引數就是accumulator或者是combiner產生的結果,也就是乙個中間的結果集。中間結果集合通過finisher方法輸出最終結果

*/

所以collector只是規定一種元素運算方式,或者說是一種運算規範,具體的運算內容可以自定義。

collector的建立

源**:

public staticcollectorof(suppliersupplier,

biconsumeraccumulator,

binaryoperatorcombiner,

functionfinisher,

characteristics... characteristics)

return new collectors.collectorimpl<>(supplier, accumulator, combiner, finisher, cs);

}

of方法返回的是乙個collectorimpl類。collectorimpl是collector中的乙個靜態內部類。這樣做的原因主要是使用者不需要自己去定義實現類,然後再進行建立,減少使用者的工作量,同時又能夠使**更簡潔優雅。

collector的建構函式接收5個引數,前面四個(supplier,accumulator,combiner,finisher),這四個引數分別對應上面介紹的四個方法。最後乙個引數使用來控制collector的執行方式的。

1、  concurrent  //將會以並行的方式進行操作

2、  unordered   //不保證輸出結果的順序(沒理解)

3、  identity_finish  //恒等函式,當傳入這個值時,finisher函式將不會執行,而直接返回結果

identity_finish: 傳入這個引數,finisher函式將會被認為是乙個恒等函式。即:輸出型別與輸入型別完全一致。此時將不會再執行finisher方法,而是將中間結

果集合進行強

制型別轉換得到最後的結果。源**如下:

collector.characteristics().contains(collector.characteristics.identity_finish)

? (r) container

concurrent:

1、  傳入這個引數,同時呼叫parallel()方法,supplier方法只會執行一次,並且會建立多個執行緒操作這個集合。

2、  不傳入這個引數,同時呼叫parallel()方法,將會執行supplier()方法多次,建立多個執行緒操作多個容器。

3、  傳入這個引數,不呼叫parallel()方法,supplier方法只會執行一次,不會建立多個執行緒,使用主線程執行操作。

java8總結(未完)

1.lambda表示式與functional介面 lambda表示式 閉包 允許把函式作為乙個方法的引數 乙個lambda由逗號分隔的引數列表 符號與函式體表示 arrays.aslist a b c foreach e system.out.println e 引數e的型別是由編譯器推測出來的,同...

總結篇上 Java8新特性總結

二 函式式介面 三 方法引用與構造器引用 2 構造器引用 3 陣列引用 lambda是乙個匿名函式,我們可以把lambda表示式理解為是一段可以傳遞的 使用lambda表示式可以寫出更簡潔 更靈活的 lambda表示式的重要用法是簡化某些匿名內部類的寫法。在lambda表示式中它使用了乙個新的操作符...

JAVA 8 多執行緒

方法1實現runnable介面 方法2實現thread介面 public class createthread implements runnable 匿名類 沒有建構函式 class a public static void main string args a c new k k是抽象的介面,呼...