stream and lambda(6) - stream 簡介

語言: CN / TW / HK

看完了 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 的第一隻雞就這麼通過靜態方法產生了,這叫 無雞之蛋 ,這叫開天闢地。

至此,我們已經戴上了有色眼鏡,給這些成員們在內心悄悄記在了不同的小本本:

  1. Stream 的建立
  2. Stream 的中間操作
  3. 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 的各個部位已經分拆完畢,擺上攤位,各位可自助購買,掃碼付款。小本經營,誠信為先,自取之。