换句话说,是否保证以下行打印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();
但我不确定这是否能提供任何保证,如果流可以某种方式以短路的方式确定结果。
答案 0 :(得分:13)
不,不是。由于优化的count()
实现,它不会在Java 9中执行(如果预先知道流大小,它将跳过迭代)。
有关详细信息,请参阅JDK-8067969。 JDK-9中的文档已相应更新:
如果实现可以直接从流源计算计数,则实现可以选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估中间操作。除了调试等无害情况外,强烈反对的副作用的行为参数可能会受到影响。