Java 8 peek() 方法的一些疑惑

OkidoGreen發表於2020-04-05
Stream.of("one", "two", "three", "four").peek(e -> System.out.println(e));

這樣不會有任何的輸出;

Stream.of("one", "two", "three", "four").peek(e -> System.out.println(e)).collect(Collectors.toList());

這樣輸出:
one
two
three
four

Stream.of("one", "two", "three", "four")
    .peek(e -> System.out.println("Peeked value: " + e))
    .map(String::toUpperCase)
    .peek(e -> System.out.println("Mapped value: " + e))
    .collect(Collectors.toList());

這樣輸出:
Peeked value: one
Mapped value: ONE
Peeked value: two
Mapped value: TWO
Peeked value: three
Mapped value: THREE
Peeked value: four
Mapped value: FOUR

知道 peek() 方法接受一個實現了 consumer 介面的類,但是實在是搞不清楚到底它是如何執行的。

 

------------------------------------------------------------------------------------------------------------------------------------------------

peek不是終結操作,其返回值還是Stream,你這種情況應該用forEach

處理流的方法分為惰性求值和及早求值(這兩個概念不在此展開了),對流的處理通常包括一系列惰性求知加上一個及早求值;流遇到及早求值的時候,才會真正去遍歷和執行

java8流中所有的操作都是蓄而不發的,只有執行foreach,collect等終結操作時,流的操作才會執行。
而且流內部會自動進行優化,只要得到想要的解決就不會繼續進行計算了。
peek是個中間操作,它提供了一種對流中所有元素操作的方法,而不會把這個流消費掉(foreach會把流消費掉),然後你可以繼續對流進行其他操作。

 

stream 分 中間操作 和 終端操作, (foreach, collect count)屬於終端操作;

peek: 生成一個包含原Stream的所有元素的新Stream,同時會提供一個消費函式(Consumer例項),新Stream每個元素被消費的時候都會執行給定的消費函式;

相關文章