有没有办法使用 对列表进行排序parallelStream()
?我看到有forEach
和forEachOrdered
。但我正在检查是否有如下排序方法,
list.parallelStream().map().sorted().collect(Collectors.toList());
有没有办法使用 对列表进行排序parallelStream()
?我看到有forEach
和forEachOrdered
。但我正在检查是否有如下排序方法,
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)
排序的结果不是顺序的。终端操作将保持与原始流相同的顺序,而不取决于它是顺序流还是并行流。所以之前暴露的正确代码必须在下面的注释中更改
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 ......我犯了一个错误,我不知道流的真正内部细节,我希望更新的答案能让您更好地理解流的工作原理)