1. 程式人生 > >Java8體驗(二)Stream語法詳解

Java8體驗(二)Stream語法詳解

1. Stream初體驗

我們先來看看Java裡面是怎麼定義Stream的:

A sequence of elements supporting sequential and parallel aggregate operations.

我們來解讀一下上面的那句話:

  1. Stream是元素的集合,這點讓Stream看起來用些類似Iterator;
  2. 可以支援順序和並行的對原Stream進行匯聚的操作;

大家可以把Stream當成一個高階版本的Iterator。原始版本的Iterator,使用者只能一個一個的遍歷元素並對其執行某些操作;高階版本的Stream,使用者只要給出需要對其包含的元素執行什麼操作,比如“過濾掉長度大於10的字串”、“獲取每個字串的首字母”等,具體這些操作如何應用到每個元素上,就給Stream就好了!(這個祕籍,一般人我不告訴他:))

大家看完這些可能對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的基本步驟:

  1. 建立Stream;
  2. 轉換Stream,每次轉換原有Stream物件不改變,返回一個新的Stream物件(**可以有多次轉換**);
  3. 對Stream進行聚合(Reduce)操作,獲取想要的結果;

2. 建立Stream

最常用的建立Stream有兩種途徑:

  1. 通過Stream介面的靜態工廠方法(注意:Java8裡介面可以帶靜態方法);
  2. 通過Collection介面的預設方法(預設方法:Default method,也是Java8中的一個新特性,就是介面中的一個帶有實現的方法,後續文章會有介紹)–stream(),把一個Collection物件轉換成Stream

2.1 使用Stream靜態方法來建立Stream

1. of方法:有兩個overload方法,一個接受變長引數,一個介面單一值

1 Stream<Integer> integerStream = Stream.of(1235);
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();