【发布时间】:2018-06-11 05:55:09
【问题描述】:
在处理 Java 项目时,我遇到了如下代码:
someMap.keySet().stream().sorted().forEach(/* ... */);
这里的意图显然是根据键的自然顺序为映射中的每个键做一些事情,这似乎确实是在实践中发生的事情。但是,我不确定这种行为是否得到保证。 The Javadoc for Stream#forEach 说:
此操作的行为是明确的不确定性。对于并行流管道,此操作不能保证尊重流的遇到顺序,因为这样做会牺牲并行性的好处。对于任何给定的元素,可以在库选择的任何时间和任何线程中执行操作。
我知道,如果代码使用 .parallelStream() 而不是 .stream(),则不能保证它可以工作,但由于它使用的是顺序流(Javadoc 没有说明),我'不确定。这是否保证始终有效,或者该代码是否需要使用 .forEachOrdered() 而不是 .forEach() 才能使用?
编辑:我相信这个问题不是 forEach vs forEachOrdered in Java 8 Stream 的重复,因为这个问题是在问“forEach 和 forEachOrdered 之间的区别一般是什么例子”,并且接受的答案基本上是“并行流”。这个问题专门针对顺序流。
【问题讨论】:
-
streams API是Java的函数式编程接口。在函数式编程中,基本思想是元素之间没有任何关系。甚至顺序也无所谓。顺序可能只对 display 很重要,但对单个元素的任何处理都不重要,就像您对
forEach()所做的那样。 -
事实上,如果使用
forEach,这将是一个很好的优化——因此是一个无序的管道——优化了排序。
标签: java java-stream language-lawyer