天天看點

JDK1.8中的stream的操作總結

Stream是Java8的一大亮點,是對容器對象功能的增強,專注于對容器對象進行各種非常便利、高效的 聚合操作(aggregate operation)或者大批量資料操作。Stream API借助于同樣新出現的Lambda表達式,極大的提高程式設計效率和程式可讀性。同時,它提供串行和并行兩種模式進行彙聚操作,并發模式能夠充分利用多核處理器的優勢,使用fork/join并行方式來拆分任務和加速處理過程。是以說,Java8中首次出現的 java.util.stream是一個函數式語言+多核時代綜合影響的産物。

  接下來我們就通過歸納總結來回顧一下jdk8中stream的一些函數以及stream的一些特性,加深對stream的了解和使用。

日常中對于資料的篩選是非常普通的操作了,以前通常都會放在資料庫篩選或者自己寫方法進行篩選。

擷取某些行資料,一行就搞定。

該操作的作用就是将input Stream的每一個元素,按照一定規則處理之後,映射成output Stream的另一個元素,相當于一對一的輸入輸出,平時該方式使用較多。

比如說:

顧名思義,用于轉換流類型的方法。這個沒有什麼可說的。

這個操作方法被稱作:平鋪,我了解的更像是集合的合并操作。看下面的例子。

将二維轉成了一維。

比較簡單,可能需要注意的是,不能修改自己包含的本地變量值,也不能使用 break/return 之類的關鍵字提前結束循環。

擷取第一個元素。但沒有擷取第二個、第三個、最後一個元素的函數方法。

這個方法的作用主要是把Stream中的元素組合起來,比如說字元串拼接,數值類型的求和等都是特殊的reduce操作,并且我們可以根據重載方法選擇是否有初始值。

reduce方法可以結合filter,map進行各種複合操作,是我們非常常用的方法。也是我們需要掌握和了解的方法。

limit是取流前n個元素,skip是跳過前m個元素剩餘的元素,這兩個方法有點像用來做分頁用的。在mongodb操作記憶體資料時經常會使用到這些方法。

進行排序,預設的自然排序規則進行排序, 也可以指定具體的比較器來進行排序。

Stream中的findAny、max/min、reduce等方法等傳回Optional值。還有例如IntStream.average()傳回OptionalDouble等等.這裡比較重點的是Optional的傳回值類型,Optional:這也是一個模仿 Scala 語言中的概念,作為一個容器,它可能含有某值,或者不包含,使用它的目的是盡可能避免NullPointerException。

使用Optional代碼的可讀性更好,而且它提供的是編譯時檢查,能極大的降低NPE這種Runtime Exception 對程式的影響,或者迫使程式員更早的在編碼階段處理空值問題,而不是留到運作時再發現和調試。

Stream 的特性可以歸納為:

繼續閱讀