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 Stream中forEach vs forEachOrdered的重复,因为这个问题是"一般来说forEach和forEachOrdered之间有什么区别的例子",并且接受的答案基本上是"并行流" .这个问题具体是关于顺序流.
不能保证forEach终端操作将处理遭遇顺序中的元素,因此"显然是不确定的".虽然在当前实现下,它应该按照流的遭遇顺序处理顺序流的元素.
forEachOrdered 主要用于您正在使用并行流并且如果流具有已定义的遭遇顺序则要遵守流的遭遇顺序的情况.
使用forEach或forEachOrdered在顺序流上使用具有相同的效果,因此这是一个偏好问题.
如上所述,在当前的实现中,我们知道forEach终端操作应该按照流的遭遇顺序处理顺序流的元素,但由于它没有在java文档中声明,所以最好坐在栅栏上并使用,forEachOrdered如果你真的关心迭代顺序.
| 归档时间: |
|
| 查看次数: |
1053 次 |
| 最近记录: |