Stream.sorted().forEach()是否按预期工作?

Jos*_*ica 3 java language-lawyer java-stream

在处理Java项目时,我遇到了如下所示的代码:

someMap.keySet().stream().sorted().forEach(/* ... */);
Run Code Online (Sandbox Code Playgroud)

根据键的自然顺序,这里的意图显然是为地图中的每个键做一些事情,这似乎是在实践中发生的事情.但是,我不确定这种行为是否得到保证.Javadoc for Stream#forEach说:

此操作的行为明确是不确定的.对于并行流管道,此操作不保证遵守流的遭遇顺序,因为这样做会牺牲并行性的好处.对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作.

我知道如果代码使用.parallelStream().stream()不是保证它不能保证工作,但由于它使用的是顺序流(Javadoc没有说什么),我不确定.这是保证始终有效,还是代码需要使用.forEachOrdered()而不是.forEach()它?

编辑:我认为这个问题不是Java 8 StreamforEach vs forEachOrdered的重复,因为这个问题是"一般来说forEach和forEachOrdered之间有什么区别的例子",并且接受的答案基本上是"并行流" .这个问题具体是关于顺序流.

Ous*_* D. 9

不能保证forEach终端操作将处理遭遇顺序中的元素,因此"显然是不确定的".虽然在当前实现下,它应该按照流的遭遇顺序处理顺序流的元素.

forEachOrdered 主要用于您正在使用并行流并且如果流具有已定义的遭遇顺序则要遵守流的遭遇顺序的情况.

使用forEachforEachOrdered在顺序流上使用具有相同的效果,因此这是一个偏好问题.

如上所述,在当前的实现中,我们知道forEach终端操作应该按照流的遭遇顺序处理顺序流的元素,但由于它没有在java文档中声明,所以最好坐在栅栏上并使用,forEachOrdered如果你真的关心迭代顺序.

  • 它目前提供了这种行为,我希望它始终会这样,但由于合同中没有保证我不会依赖它.我同意[这个答案](/sf/answers/2295837771/).如果您关心迭代顺序,请使用表示您关心迭代顺序的方法.除了为自己保存7个字符外,没有理由不这样做. (4认同)