Stream.count()是否保证访问每个元素?

Hul*_*ulk 7 java java-8 java-stream

换句话说,是否保证以下行打印num线?

int num = list.stream().peek(System.out::println).count();
Run Code Online (Sandbox Code Playgroud)

这个问题是由/sf/answers/2894261051/的评论中的讨论引发的

我依稀记得一个讨论,即避免迭代的优化可能是合法的,但在快速搜索期间没有找到任何结论.

Stream.countJavaDocs包含以下语句:

这是减少的特殊情况,相当于:
return mapToLong(e -> 1L).sum();

但我不确定这是否能提供任何保证,如果流可以某种方式以短路的方式确定结果.

Tag*_*eev 13

不,不是.由于优化的count()实现,它不会在Java 9中完成(如果预先知道流大小,它将跳过迭代).

有关更多详细信息,请参阅JDK-8067969.JDK-9中的文档已相应更新:

如果实现可以直接从流源计算计数,则实现可以选择不执行流管道(顺序地或并行地).在这种情况下,不会遍历任何源元素,也不会评估中间操作.除了诸如调试之类的无害情况之外,强烈不鼓励具有副作用的行为参数可能会受到影响.

  • 当支持分裂器为SIZED时,很可能会跳过迭代. (2认同)