Stream.sorted().forEach()在Java顺序流中是否能保证按预期执行?
关于顺序流中
forEach是否保证执行顺序的问题 这个问题抓得非常准——很多人都会被forEach文档里的“不确定性”描述吓到,但其实这里有个关键的场景区分:在顺序流中,forEach是严格遵循流的相遇顺序执行的,你的代码行为完全有官方保障。
核心依据:官方文档的细节补充
虽然Stream#forEach的Javadoc确实写了“行为具有明确的不确定性”,但这段描述是针对并行流的场景。我们需要结合Stream接口的整体规范来看:
对于顺序流,相遇顺序的存在与否只影响确定性,不影响性能。如果流是有序的,大多数操作都会被约束为按照相遇顺序处理元素;如果流是无序的,操作可以自由忽略相遇顺序。
你代码里的流是默认的顺序流(stream()方法生成的就是顺序流),而且经过sorted()处理后,流的相遇顺序已经明确是键的自然排序顺序。这种情况下,forEach会严格按照这个顺序依次处理每个元素,和你预期的完全一致。
和forEachOrdered的区别
那什么时候需要用forEachOrdered?简单梳理:
- 如果是并行流:
forEach会因为并行优化打乱执行顺序,而forEachOrdered会强制按相遇顺序执行,但会牺牲并行性能(因为必须等待前置元素处理完成)。 - 如果是顺序流:
forEach和forEachOrdered的执行效果完全一致,但forEach的性能理论上略优(不过实际业务场景中差别几乎可以忽略)。
所以你的代码完全不需要改成forEachOrdered,当前的写法就足够可靠。
内容的提问来源于stack exchange,提问作者Joseph Sible-Reinstate Monica
相关产品推荐
相关产品推荐

