Java Stream 筆記(上)
這篇主要就把Java8,比較常用到的Stream功能給列出來,還有一些參考範例。解說的部分不會到太詳盡,如果想要更詳細一點可以找書來看書。目前是沒有找到完全都在講Java stream的中文書,大部分都是某幾個章節有提到,可以去參考看看。
在看這篇所需要的先備知識:
- Java Lambda的使用。
- 瞭解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)這個之後會再提到)。
*注意:filter需要有比較條件
5. map():
對當前傳入的stream進行處理並轉換成另一個stream。
簡單來說,就是對stream裡面的每一個元素進行轉換。
*這邊的map不知道大家會不會把他跟資料型態的map搞混,筆者我一開始學以為這個map跟資料結構的map一樣,但其實是完全不一樣的東西所以請大家注意一下。
6. flatmap ():
對每個元素執行指定的動作,並用所有執行後返回Stream中的元素,再組成一個新的Stream作為最終返回的結果。
其中跟map比較不一樣的是,轉換前後元素的個數和類型都可能會改變。
程式碼概念如下:
最上面可以看到有兩個字串”Hello”, “World”,然後中間我們做了一個 split,也就是把每個字母分開,再來我們用flat Map把每一個字母分開成一個獨立的字母。最後用distinct把沒有重複的字母 collect起來成為新的 list<String>出來。
那如果沒有做flatMap會出現以下情況:
有兩個字串,字串先做split把他們都分開,然後使用distinct,這邊我們可以看到,字串就算做split之後也都還是包在同一個字串裡面,沒有什麼變動,所以之後要做的東西也都沒有什麼用。
7. collect():
相信如果上面的東西都有好好理解的話,collect應該已經知道他主要的功能了吧。
簡單來說就是可以把一個新生成的stream轉成新的資料型態。
這邊做不多做其他的範例了~~
JAVA Stream就先到講到這邊,希望有幫助再學習Java Stream的讀者們。
那我們就下次再見囉~~