Java8除了Lambda表達式外還提供了另外一個重要的特性,即集合的批處理操做,集合類的批處理操做API的目的是實現集合類的「內部迭代」,並指望充分利用現代多核CPU進行並行計算。Java8以前集合類的迭代(Iteration)都是外部的,即客戶代碼。而內部迭代意味着改由Java類庫來進行迭代,而不是客戶代碼。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.spa
意思是Stream是一個支持順序以及併發的集合處理操做的元素序列code
Stream接口在java.util.stream包下,主要的實現有IntStream、LongStream、DoubleStream等,Stream對象的建立主要有兩種方式:orm
經過Collection接口的默認方法stream()建立對象
經過Stream接口的靜態工廠方法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便可