如何在 parallelStream 中对列表进行排序?

How to sort list in parallelStream?

有没有办法使用 parallelStream() 对列表进行排序?我看到有 forEachforEachOrdered。但是我正在检查是否有一种方法可以按如下方式排序,

list.parallelStream().map().sorted().collect(Collectors.toList());

并行流只是标准流,因此可以将 sorted 应用于并行流。 sorted 方法的结果是顺序流。

所以它的工作原理如下:

 list.parallelStream()   // Generate a parallel stream
     .map(item -> ...)   // Item are mapped in parallel
     .sorted()           // sorted needs to wait for all elements before continuing
                         // Here the stream is sequential
     .collect(Collectors.toList());   // Collect to a new list

因此 sorted 可以对并行流进行操作,但是结果流是顺序的并且它仅被释放在接收到并行流的所有元素后.


更新的答案(感谢@Louis Wasserman)

sorted的结果不是顺序的。终端操作将保持与原始流相同的顺序,而不取决于它是顺序流还是并行流。 所以之前暴露的正确代码必须在下面的注释中更改

 list.parallelStream()   // Generate a parallel stream
     .map(item -> ...)   // Item are mapped in parallel
     .sorted()           // sorted needs to wait for all elements before continuing
                         // REMOVED --> Here the stream is sequential
     .collect(Collectors.toList());   // Collect to a new list
                                      // ADDED --> in the same order of the received after the sorted step

如果在随机执行时间的排序后添加一个map操作,可以看到这个map操作可以在不同时刻结束,但最后collect会按照原来的顺序生成一个List。 (感谢 Louis Wasserman...我犯了一个错误,我不知道流的真正内部细节,我希望更新后的答案能让你更好地理解流的工作原理)