Java8體驗(二)Stream語法詳解
1. Stream初體驗
我們先來看看Java裡面是怎麼定義Stream的:
A sequence of elements supporting sequential and parallel aggregate operations.
我們來解讀一下上面的那句話:
- Stream是元素的集合,這點讓Stream看起來用些類似Iterator;
- 可以支援順序和並行的對原Stream進行匯聚的操作;
大家可以把Stream當成一個高階版本的Iterator。原始版本的Iterator,使用者只能一個一個的遍歷元素並對其執行某些操作;高階版本的Stream,使用者只要給出需要對其包含的元素執行什麼操作,比如“過濾掉長度大於10的字串”、“獲取每個字串的首字母”等,具體這些操作如何應用到每個元素上,就給Stream就好了!(這個祕籍,一般人我不告訴他:))
1 |
//Lists是Guava中的一個工具類 |
2 |
List<Integer>
nums = Lists.newArrayList( 1 , null , 3 , 4 , null , 6 ); |
3 |
nums.stream().filter(num
-> num != null ).count(); |
上面這段程式碼是獲取一個List中,元素不為null的個數。這段程式碼雖然很簡短,但是卻是一個很好的入門級別的例子來體現如何使用Stream,正所謂“麻雀雖小五臟俱全”。我們現在開始深入解刨這個例子,完成以後你可能可以基本掌握Stream的用法!
1.1 剖析Stream通用語法
圖片就是對於Stream例子的一個解析,可以很清楚的看見:原本一條語句被三種顏色的框分割成了三個部分。紅色框中的語句是一個Stream的生命開始的地方,負責建立一個Stream例項;綠色框中的語句是賦予Stream靈魂的地方,把一個Stream轉換成另外一個Stream,紅框的語句生成的是一個包含所有nums變數的Stream,進過綠框的filter方法以後,重新生成了一個過濾掉原nums列表所有null以後的Stream;藍色框中的語句是豐收的地方,把Stream的裡面包含的內容按照某種演算法來匯聚成一個值,例子中是獲取Stream中包含的元素個數。如果這樣解析以後,還不理解,那就只能動用“核武器”–圖形化,一圖抵千言!
在此我們總結一下使用Stream的基本步驟:
- 建立Stream;
- 轉換Stream,每次轉換原有Stream物件不改變,返回一個新的Stream物件(**可以有多次轉換**);
- 對Stream進行聚合(Reduce)操作,獲取想要的結果;
2. 建立Stream
最常用的建立Stream有兩種途徑:
- 通過Stream介面的靜態工廠方法(注意:Java8裡介面可以帶靜態方法);
- 通過Collection介面的預設方法(預設方法:Default method,也是Java8中的一個新特性,就是介面中的一個帶有實現的方法,後續文章會有介紹)–stream(),把一個Collection物件轉換成Stream
2.1 使用Stream靜態方法來建立Stream
1. of方法:有兩個overload方法,一個接受變長引數,一個介面單一值
1 |
Stream<Integer>
integerStream = Stream.of( 1 , 2 , 3 , 5 ); |
2 |
Stream<String>
stringStream = Stream.of( "taobao" ); |
2. generator方法:生成一個無限長度的Stream,其元素的生成是通過給定的Supplier(這個介面可以看成一個物件的工廠,每次呼叫返回一個給定型別的物件)
1 |
Stream.generate( new Supplier<Double>()
{ |
2 |
@Override |
3 |
public Double
get() { |
4 |
return Math.random(); |