如何在 parallelStream 中对列表进行排序?
How to sort list in parallelStream?
有没有办法使用 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)
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...我犯了一个错误,我不知道流的真正内部细节,我希望更新后的答案能让你更好地理解流的工作原理)
有没有办法使用 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)
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...我犯了一个错误,我不知道流的真正内部细节,我希望更新后的答案能让你更好地理解流的工作原理)