2017-10-28 123 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,所以流终止。 –