-1

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

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

1 回答 1

1

并行流只是标准流,因此可以应用于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)

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

 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

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

于 2021-08-10T17:08:36.030 回答