標籤:
集合類的批處理:
Java8除了Lambda運算式外還提供了另一個重要的特性,即集合的批處理操作,集合類的批處理操作API的目的是實現集合類的“內部迭代”,並期望充分利用現代多核CPU進行並行計算。Java8之前集合類的迭代(Iteration)都是外部的,即客戶代碼。而內部迭代意味著改由Java類庫來進行迭代,而不是客戶代碼。
例如Java8以前版本要遍曆一個集合通常是:
for(Object o: list) { System.out.println(o);}
而在Java8中可以配合Lambda運算式:
list.forEach(o -> System.out.println(o));
集合類中都有forEach方法,方法的參數是一個函數介面Consumer,這個函數式介面有一個accept()方法用來接受單個參數,在forEach方法實現中,accept()接受的參數即為每次遍曆集合得到的元素。forEach方法相對於以前的for迴圈來說也只是用了Lambda使代碼更簡潔了,但他卻是也是串列的操作每個元素,相對於for迴圈效能上並沒有提升,而之前所說的並存執行是由於集合中引入的Stream。
在Java的文檔中給出的Stream定義是:
A sequence of elements supporting sequential and parallel aggregate operations.
意思是Stream是一個支援順序以及並發的集合處理操作的元素序列
Stream介面在java.util.stream包下,主要的實現有IntStream、LongStream、DoubleStream等,Stream對象的建立主要有兩種方式:
通過Collection介面的預設方法stream()建立
通過Stream介面的靜態Factory 方法of()建立
而Stream介面提供的方法也大致分為了兩類:
一類對原Stream元素進行篩選、變換、做處理等操作,最終返回一個處理後的新的Stream對象,可以鏈式調用用多個方法共同處理
一類是在得到處理後的新Stream後,用來擷取想要的非Stream類型結果,如集合、Stream元素中的最大值、過濾後剩餘的元素個數等
Stream部分我發現一個寫的很詳細的部落格,想要深入學習可以參考 http://ifeve.com/stream/
雙冒號的使用:
Java8中新加了 ::這種操作符,用來傳遞方法或者構造方法的引用,這個特性主要是用來簡化Lambda運算式,如上面forEach方法的例子,可以簡化為:
list.forEach(System.out::println)
要使用這種方法簡化Lambda也是有一些限制的,首先Lambda運算式代碼塊中的代碼必須是直接調用了另外的一個方法,並且方法的參數個數、順序以及類型都必須和對應介面中的抽象方法一致。同樣需要得到構造方法的引用,只需要String::new這樣,在類後面::new即可
Java 8新特性(二)