Does Stream.sorted().forEach() work as intended?
在处理Java项目时,我遇到了如下所示的代码:
1 | someMap.keySet().stream().sorted().forEach(/* ... */); |
根据键的自然顺序,这里的意图显然是为地图中的每个键做一些事情,这似乎是在实践中发生的事情。但是,我不确定这种行为是否得到保证。 Javadoc for Stream#forEach说:
The behavior of this operation is explicitly nondeterministic. For parallel stream pipelines, this operation does not guarantee to respect the encounter order of the stream, as doing so would sacrifice the benefit of parallelism. For any given element, the action may be performed at whatever time and in whatever thread the library chooses.
我知道如果代码使用
编辑:我认为这个问题不是Java 8 Stream中forEach vs forEachOrdered的重复,因为这个问题是"一般来说forEach和forEachOrdered之间有什么区别的例子",并且接受的答案基本上是"并行流" 。这个问题具体是关于顺序流。
不能保证
在顺序流上使用
如上所述,在当前的实现中,我们知道
在当前的实现下,它是 - 但文档很清楚,不要将其指定为规则。这显然可以改变,但目前它没有改变,即使在做的时候:
1 2 3 |
即使您是故意破坏顺序,对于顺序流,数据也不会在内部故意改组 - 至少目前不是。
你必须要小心,不要依赖它,因为版本之间的事情可以改变,这是一个例子
Is this guaranteed to always work, or would that code need to be using .forEachOrdered() instead of .forEach() for it to be?
不,不能保证始终有效。正如javadoc所说,
如果您需要保证确定性,请使用javadoc明确保证的方法。在未来的版本中,
所以...我会向该应用程序的维护者指出这个错误。我们无法预测它将来会破裂,但它当然可以。潜在的错误是错误。