Java lamda Stream

 

 

  • Intermediate:一個流能夠後面跟隨零個或多個 intermediate 操做。其目的主要是打開流,作出某種程度的數據映射/過濾,而後返回一個新的流,交給下一個操做使用。這類操做都是惰性化的(lazy),就是說,僅僅調用到這類方法,並無真正開始流的遍歷。
  • Terminal:一個流只能有一個 terminal 操做,當這個操做執行後,流就被使用「光」了,沒法再被操做。因此這一定是流的最後一個操做。Terminal 操做的執行,纔會真正開始流的遍歷,而且會生成一個結果,或者一個 side effect。

  在對於一個 Stream 進行屢次轉換操做 (Intermediate 操做),每次都對 Stream 的每一個元素進行轉換,並且是執行屢次,這樣時間複雜度就是 N(轉換次數)個 for 循環裏把全部操做都作掉的總和嗎?其實不是這樣的,轉換操做都是 lazy 的,多個轉換操做只會在 Terminal 操做的時候融合起來,一次循環完成。咱們能夠這樣簡單的理解,Stream 裏有個操做函數的集合,每次轉換操做就是把轉換函數放入這個集合中,在 Terminal 操做的時候循環 Stream 對應的集合,而後對每一個元素執行全部的函數。java

還有一種操做被稱爲 short-circuiting。用以指:ide

  • 對於一個 intermediate 操做,若是它接受的是一個無限大(infinite/unbounded)的 Stream,但返回一個有限的新 Stream。
  • 對於一個 terminal 操做,若是它接受的是一個無限大的 Stream,但能在有限的時間計算出結果。

當操做一個無限大的 Stream,而又但願在有限時間內完成操做,則在管道內擁有一個 short-circuiting 操做是必要非充分條件。函數

 

 

int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
 .mapToInt(w -> w.getWeight())
 .sum();

  

stream() 獲取當前小物件的 source,filter 和 mapToInt 爲 intermediate 操做,進行數據篩選和轉換,最後一個 sum() 爲 terminal 操做,對符合條件的所有小物件做重量求和。ui

 

  • Intermediate:

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unorderedblog

  • Terminal:

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iteratorip

  • Short-circuiting:

anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limitci

相關文章
相關標籤/搜索