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

时间:2019-02-06 17:36:48

标签: 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());

此打印:

A
A

为什么不打印:

A
A
B
B
C
C
D
D

1 个答案:

答案 0 :(得分:8)

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

  

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

     

这是短路端子操作。

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

  

在流实现能够优化某些或所有元素的产生的情况下(例如使用findFirst之类的短路操作,或在count()中描述的示例中),这些元素将不会调用该操作。

findAny方法发生短路,因此将仅针对peek找到的元素调用findAny的动作。

这就是为什么在打印输出中仅获得两个A值的原因。一个通过peek方法打印,然后打印第二个,它是Optional返回的findAny内部的值。