Java SE8使用Lambda語法操作串流(Stream)物件

潘家羲Sparrow Pan

  • 恆逸教育訓練中心-資深講師
  • 技術分類:程式設計

 

 

什麼…… Lambda語法可操作Java I/O的串流?有沒有搞錯?哈哈!別誤會、別誤會,今天要談的串流(Stream)物件並非Java I/O的串流,而是Java SE8 在java.util.stream套件下新增的Stream類別。

所謂的串流(Stream)物件指的是一個序列(Sequence)的元素(element)資料,可讓串連的方法(chaining methods)進行操作。其中,串流(Stream)物件具有下列三大特性:
(1) 串流物件不可改變(immutable)
(2) 串流裡的資料被消費後就不復存在
(3) 串流可以循序(sequence)操作,也可以平行(parallel)操作

我們先來看一段傳統程式語法的片段:



這段程式大概的意思是:先從快取資料取得銷售紀錄(SalesRecord)列表,接著根據特定條件,在for each迴圈內過濾篩選特定的銷售紀錄,接著輸出符條件的銷售紀錄。在JavaSE8中,結合Lambda語法、串流(Stream)與方法串連(Method Chaining)操作,上述的程式片段可以用一行Statement改寫如下:



哇!一行Statement就搞定,是不是很神奇呢? Java SE8把這樣的程式撰寫風格稱為管線式(Pipeline)的操作。一個串流(Stream)的管線(Pipeline)是由下列三項要素所組成:
一個來源(Source):例如檔案、陣列、集合等
零到多個中介操作(intermediate operations):filter()、map()、peek()…
一個終端操作(terminal operation):forEach()、findFirst()、findAny()…
以上述程式片段的管線(Pipeline)操作為例,來源是集合List<SalesRecord>,中介操作是filter(),終端操作是forEach()。那麼既然管線(Pipeline)操作可以夾帶零到多個中介操作,上述的程式片段可以更進一步優化如下:

這麼一來,程式碼是不是變得更優雅、更簡潔,同時可讀性也大幅度提高了呢?Java SE8 Lambda語法的出現除了顛覆傳統程式開發的思維,更創造出無限的可能性,未來對Java生態的影響力可能不亞於@Annotation喔!