我是Java的Stream API的新手,我对这种情况的结果感到困惑:
Stream<String> stream = Stream.of("A","B","C","D");
System.out.println(stream.peek(System.out::println).findAny().get());
此打印:
A
A
为什么不打印:
A
A
B
B
C
C
D
D
答案 0 :(得分:8)
findAny
method找不到所有元素;它只找到一个元素。
返回描述流中某些元素的
Optional
,如果流为空,则返回空的Optional
。这是短路端子操作。
直到调用终端方法(在这种情况下为findAny
)后,流才被处理。但是peek
method不会在元素上执行其操作,直到该元素被终端操作消耗为止。
在流实现能够优化某些或所有元素的产生的情况下(例如使用
findFirst
之类的短路操作,或在count()
中描述的示例中),这些元素将不会调用该操作。
findAny
方法发生短路,因此将仅针对peek
找到的元素调用findAny
的动作。
这就是为什么在打印输出中仅获得两个A
值的原因。一个通过peek
方法打印,然后打印第二个,它是Optional
返回的findAny
内部的值。