Java Stream 筆記(上)

Sharon Peng
4 min readJul 1, 2020

--

這篇主要就把Java8,比較常用到的Stream功能給列出來,還有一些參考範例。解說的部分不會到太詳盡,如果想要更詳細一點可以找書來看書。目前是沒有找到完全都在講Java stream的中文書,大部分都是某幾個章節有提到,可以去參考看看。

在看這篇所需要的先備知識:

  1. Java Lambda的使用。
  2. 瞭解Java的Collection,List, Map等等的使用。

本章會提到的有:

1. collection

2. forEach

3. filter

4. map

5. flatMap

6. collect

那我們就進入正題吧!

首先,如何創建一個Stream呢?

1. Collection中的默認方法:

Collection中有一個 stream的方法,可以把 Collection下的所有子類別,直接獲取對應的stream對象。

使用範例:

使用Collection.stream()或是Arrays.stream()
宣告方法:主要先宣告stream,後面再用list依型態的不同去做轉換的動作。

2. forEach():

對容器裡面的每個元素執行特定的動作,也可以說是對容器裡面的元素作遍歷的動作(就是全部造訪的意思)

我們這邊就會一直沿用上面Person的例子,所以大家要參照的時候就請看一下上面的例子。

如果是要遍歷的型態是Map則可以這樣:

(k, v) ->所要執行的動作

對應key跟value然後用 k : v 的樣式印出。

這個程式碼也可以直接放到上面的程式裡面~~

4. filter():

用特定條件去過濾stream裡面不需要的元素,然後返回一個新的stream(使用collect(toList)這個之後會再提到)。

從person中把小於30歲的人取出來,儲存到新的Younger List裡面。

*注意:filter需要有比較條件

5. map():

對當前傳入的stream進行處理並轉換成另一個stream。

簡單來說,就是對stream裡面的每一個元素進行轉換。

*這邊的map不知道大家會不會把他跟資料型態的map搞混,筆者我一開始學以為這個map跟資料結構的map一樣,但其實是完全不一樣的東西所以請大家注意一下。

這邊用map把裡面的LastName元素都變成大寫,並存到新的List<String>t裡面

6. flatmap ():

對每個元素執行指定的動作,並用所有執行後返回Stream中的元素,再組成一個新的Stream作為最終返回的結果。

其中跟map比較不一樣的是,轉換前後元素的個數和類型都可能會改變。

程式碼概念如下:

最上面可以看到有兩個字串”Hello”, “World”,然後中間我們做了一個 split,也就是把每個字母分開,再來我們用flat Map把每一個字母分開成一個獨立的字母。最後用distinct把沒有重複的字母 collect起來成為新的 list<String>出來。

圖片出自:Java 8 in Action

那如果沒有做flatMap會出現以下情況:

有兩個字串,字串先做split把他們都分開,然後使用distinct,這邊我們可以看到,字串就算做split之後也都還是包在同一個字串裡面,沒有什麼變動,所以之後要做的東西也都沒有什麼用。

圖片出自:Java 8 in Action

7. collect():

相信如果上面的東西都有好好理解的話,collect應該已經知道他主要的功能了吧。

簡單來說就是可以把一個新生成的stream轉成新的資料型態。

這邊做不多做其他的範例了~~

JAVA Stream就先到講到這邊,希望有幫助再學習Java Stream的讀者們。

那我們就下次再見囉~~

--

--