我是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

最佳答案

findAny method找不到所有元素;它只找到一个元素。

返回描述流中某些元素的Optional,如果流为空,则返回一个空的Optional
这是短路端子操作。

在调用终端方法(在这种情况下为findAny)之前,不会处理该流。但是 peek method不会在元素上执行其操作,直到该元素被终端操作消耗为止。

在流实现能够优化某些或所有元素的产生的情况下(例如使用findFirst之类的短路操作,或者在count()中描述的示例中),将不会为那些元素调用该操作。
findAny方法是短路的,因此只会针对peek找到的元素调用findAny的动作。
这就是为什么在打印输出中仅获得两个A值的原因。一种是通过peek方法打印的,第二种是Optional返回的findAny内部的值。

10-04 10:20