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)
该findAny方法没有找到所有元素; 它只找到一个元素.
返回
Optional描述流的某个元素,Optional如果流为空则返回空.这是一种短路终端操作.
在调用终端方法之前,不会处理流,在这种情况下findAny.但是,在终端操作使用该元素之前,该peek方法不会对元素执行其操作.
如果流实现能够优化某些或所有元素的生成(例如,使用短路操作
findFirst,或者在描述的示例中count()),则不会为这些元素调用该操作.
该findAny方法是短路的,因此peek仅针对找到的元素调用该操作findAny.
这就是为什么你只A在打印输出中得到两个值.一个是通过该peek方法打印的,然后打印第二个,这是Optional返回的内部值findAny.