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

时间:2016-12-27 14:34:41

标签: java java-8 java-stream

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

int num = list.stream().peek(System.out::println).count();

这个问题是由https://stackoverflow.com/a/41346586/2513200

的评论中的讨论引发的

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

JavaDocs for Stream.count包含以下声明:

  

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

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

1 个答案:

答案 0 :(得分:13)

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

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

  

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