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方法(對流來說就是終端操作)。