2017-10-28 121 views
8

我有以下代碼:Java流意想不到的結果

Stream.of("Java", "Stream", "Test") 
     .peek(s -> System.out.print(s + " ")) 
     .allMatch(s -> s.startsWith("J")); 

爲什麼它打印我的Java流?

+1

另請參見[在Java流是真的只用於調試嗎?](https://stackoverflow.com/a/33636377/2711488) – Holger

+0

與流行的思維方式(和實際實施)相反,最好考慮流就好像最後一次操作是拉動元素,而不是流推動它們。 – Dariusz

回答

10

allMatch短路作爲大多數流操作是。由於allMatch早期返回,這就是爲什麼peek只打印前兩個元素。

2

因爲allMatch()會檢查數據流中的每個人元素是否爲真。而由於第二個是錯誤的,它不需要進一步檢查。

所以peek()不會打印第3個元素。

+0

Yeap,我明白它沒有被執行每個元素,那是我的問題 - 爲什麼?所以你說它停止執行第二個元素,這就是爲什麼我只看到兩個值? – asdasdsdf

+0

是的。因爲'allMatch()'的第二個元素是false,所以流終止。 –