使用peek和findAny在Java Stream结果上感到困惑

E2r*_*abi 4 java java-8 java-stream

我是Java的Stream API的新手,我对这个案例的结果感到困惑:

Stream<String> stream = Stream.of("A","B","C","D");
System.out.println(stream.peek(System.out::println).findAny().get());
Run Code Online (Sandbox Code Playgroud)

这打印:

A
A
Run Code Online (Sandbox Code Playgroud)

为什么不打印:

A
A
B
B
C
C
D
D
Run Code Online (Sandbox Code Playgroud)

rge*_*man 8

findAny方法没有找到所有元素; 它只找到一个元素.

返回Optional描述流的某个元素,Optional如果流为空则返回空.

这是一种短路终端操作.

在调用终端方法之前,不会处理流,在这种情况下findAny.但是,在终端操作使用该元素之前,该peek方法不会对元素执行其操作.

如果流实现能够优化某些或所有元素的生成(例如,使用短路操作findFirst,或者在描述的示例中count()),则不会为这些元素调用该操作.

findAny方法是短路的,因此peek仅针对找到的元素调用该操作findAny.

这就是为什么你只A在打印输出中得到两个值.一个是通过该peek方法打印的,然后打印第二个,这是Optional返回的内部值findAny.