流操作

Philip發表於2018-08-31

java.util.stream.Stream中的Stream介面定義了許多操作。它們可以分為兩大類。

我們再來看一下前面的例子:

List<String> names = menu.stream()// 從選單獲得流
    .filter(d -> d.getCalories() > 300)// 中間操作
    .map(Dish::getName)// 中間操作
    .limit(3)// 中間操作
    .collect(toList);// 將Stream轉換為List
複製程式碼

你可以看到兩類操作:

  • filter、map和limit可以練成一條流水線;
  • collect觸發流水線執行並關閉它。

可以連線起來的操作稱為中間操作,關閉流的操作稱為終端操作

中間操作:諸如filter或sorted等中間操作會返回另一個流。這讓多個操作可以連線起來成為一個查詢。重要的是,除非流水線上觸發一個終端操作,否則中間操作不會執行任何處理--它們很懶。這是因為中間操作一般都可以合併起來,再終端操作時一次性全部處理。

終端操作:終端操作會從流水線生成結果。其結果時任何不是流的值,比如List、Integer,甚至void。

總而言之,流的使用一般包括三件事:

  • 一個資料來源(如集合)來執行一個查詢;
  • 一箇中間操作鏈,形成一條流的流水線;
  • 一個終端操作,執行流水線,並能生成結果。

流的流水線背後的理念類似於構建器模式。在構建器模式中有一個呼叫鏈用來設定一套配置(對流來說這就是一箇中間操作鏈),接著是呼叫built方法(對流來說就是終端操作)。

相關文章