stream and lambda(6) - stream 簡介
看完了 lambda
,是時候瞭解下 stream
了。到這裡,我們的第二位主角終於登場了。Java8 推出這個極具實用性的 stream
。
黃四郎:Stream,Java8 用的 stream。Stream,You know?
馬邦德:Stream,流,檔案操作用的!
黃四郎:你看看這位師爺就是裝糊塗的高手,Stream,說成操作檔案的,那 IO 是什麼?
馬邦德:流,Java8 stream,提供集合便捷操作的。
未見其貌,先聞其聲
讓我們先從一個小例子入手:將 List<Integer> 轉為 List<String>。
Java8 之前我們這麼寫:
public void oldMapType() { List<Integer> integers = Arrays.asList(1, 2, 5, 7, 9, 11, 3); List<String> resList = new ArrayList<>(); for (Integer integer : integers) { resList.add(String.valueOf(integer)); } System.out.println(resList); }
使用 stream 這麼寫:
public void streamMapType() { List<Integer> integers = Arrays.asList(1, 2, 5, 7, 9, 11, 3); List<String> resList = integers.stream().map(String::valueOf).collect(Collectors.toList()); System.out.println(resList); }
看,是不是簡單了很多?
看其體廓
Stream
本身是個介面,且內容過多,我們還是跳過程式碼定義,直接看類圖吧。

乍一看,方法太多太亂,我們來一步一步分門別類的看。
再辨其貌
粗略從返回值來看,分為兩種。一種是返回型別為 Stream
,一種是返回具體的某個型別或者 void
。
想一想, Stream
呼叫了自身的方法,返回的型別還是 Stream
,可以幹什麼?套娃?好吧,沒錯,你可以無限套娃。如果返回型別不是 Stream
,好了,套娃結束,GG。
再看方法型別,比如 empty()
,方法圖示上是不是有個小菱形?什麼,是銅錢的形狀,呼叫該方法要 加錢
?不不不,這是給 JVM
交了保護費的意思,成為靜態方法了,不用例項化就可以直接呼叫。
那麼問題來了,靜態方法,在沒有例項化 Stream
之前就可以呼叫,此時還沒有那隻雞,怎麼雞生蛋再蛋生雞,怎麼套娃!但是 Stream
的第一隻雞就這麼通過靜態方法產生了,這叫 無雞之蛋
,這叫開天闢地。
至此,我們已經戴上了有色眼鏡,給這些成員們在內心悄悄記在了不同的小本本:
- Stream 的建立
- Stream 的中間操作
- Stream 的終止操作
查水錶
Stream
的成員方法,早已登記在冊,我們可以輕鬆通過 Javadoc
來看他們到底幹什麼的。
Stream 的建立
方法 | 說明 |
---|---|
empty | 敷衍:返回一個沒有任何元素的空流 |
concat | 合體:合併兩個流成一個流 |
generate | 無盡:根據傳入的Supplier返回一個無限流 |
iterate | 迭代:依次迭代生成元素的流 |
of | 加工:將傳入的引數組合成一個流 |
Stream 的中間操作
方法 | 說明 |
---|---|
filter | 根據傳入的條件過濾出符合要求的元素 |
distinct | 沒錯,和sql一樣,去重 |
limit | 沒錯,和sql一樣,取前幾個 |
skip | 排除前n個元素 |
sorted | 自然排序,要求元素必須實現了 Comparable |
map | 將元素從T轉成R |
flatMap | 將每個元素從T轉成一個流,再合併成一個新的流 |
peek | 類似foreach,對流內的元素進行處理,但會重新返回流 |
Stream 的終止操作
方法 | 說明 |
---|---|
allMatch | 流元素中所有的都滿足條件,才返回true |
anyMatch | 流元素中任何一個滿足條件,就返回true |
noneMatch | 流元素中所有的都 不滿足條件 ,返回true |
count | 計算,返回元素個數 |
min | 根據比較器找最小的 |
max | 根據比較器找最大的 |
findAny | 返回任意一個元素(並行流可能不是第一個,序列是第一個) |
findFirst | 返回第一個元素 |
foreach | 和集合的foreach差不多 |
foreachOrdered | 並行流時,可以保證元素處理的順序 |
reduce | 將流內的元素匯聚成一個最終目標值 |
toArray | 將流轉成陣列 |
collect | 將元素收集起來做操作(很重要,以後再說) |
收攤
Stream
的各個部位已經分拆完畢,擺上攤位,各位可自助購買,掃碼付款。小本經營,誠信為先,自取之。
- stream and lambda(18) - 終止操作之 stream 收集器 collectors
- stream and lambda(15) - 終止操作之 stream 陣列操作 toArray
- stream and lambda(13) - 終止操作之計數 count 與比較 min、max
- stream and lambda(12) - 終止操作之查詢與匹配(findAny、findFirst、allMatch、anyMatch、noneMatch)
- stream and lambda(11) - Optional 簡介
- stream and lambda(10) - 中間操作之排序sorted與除錯peek
- stream and lambda(9) - 中間操作之map操作(map、flatmap)
- stream and lambda(8) - 中間操作之篩選操作(filter、distinct、limit、skip)
- stream and lambda(7) - stream 的建立
- stream and lambda(6) - stream 簡介
- stream and lambda(5) - lambda 表示式最佳實踐
- stream and lambda(3) - jdk 提供的函式式介面
- stream and lambda(2) - 函式式介面簡介
- stream and lambda(1) - lambda 簡介