Muh*_*edy 4 java parallel-processing java-8 java-stream
当我在Java 8中使用流应用并行排序时,我得到一个无效的结果:
List<String> list = new ArrayList<>();
list.add("A");
list.add("C");
list.add("B");
list.stream().sorted().forEach(System.out::println);
System.out.println("-");
list.stream().parallel().sorted().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
结果:
A
B
C
-
B <----- Invalid order
C
A
Run Code Online (Sandbox Code Playgroud)
为什么并行排序会返回未排序的结果?
forEach()
不保证按特定顺序处理元素:
此操作的行为明确是不确定的.对于并行流管道,此操作不保证遵守流的遭遇顺序,因为这样做会牺牲并行性的好处.对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作.如果操作访问共享状态,则它负责提供所需的同步.
您应该使用forEachOrdered()
:
list.stream().parallel().sorted(Comparator.comparing(e -> e.getFirstName()))
.forEachOrdered(System.out::println);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
193 次 |
最近记录: |