gpt4 book ai didi

java - 是否可以将有序收集器与并行流一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:27 25 4
gpt4 key购买 nike

当使用流计算笛卡尔积时,我可以并行生成它们,并按顺序使用它们,以下代码演示了这一点:

int min = 0;
int max = 9;
Supplier<IntStream> supplier = () -> IntStream.rangeClosed(min, max).parallel();
supplier.get()
.flatMap(a -> supplier.get().map(b -> a * b))
.forEachOrdered(System.out::println);

这将完美地按顺序打印所有内容,现在考虑以下代码,我想将它添加到列表中,同时保留顺序。

int min = 0;
int max = 9;
Supplier<IntStream> supplier = () -> IntStream.rangeClosed(min, max).parallel();
List<Integer> list = supplier.get()
.flatMap(a -> supplier.get().map(b -> a * b))
.boxed()
.collect(Collectors.toList());
list.forEach(System.out::println);

现在打印顺序不对了!
这是可以理解的,因为我没有要求保留顺序。

现在的问题是:是否有一种方法可以collect() 或者是否有一个 Collector 可以保持顺序?

最佳答案

当我执行您的代码时,我按顺序获得了输出。事实上,这两个代码得到了相同的输出。从 Collectors.toList 返回的 Collector 似乎已经排序,如下面的代码所示:

Collector collector = Collectors.toList();
System.out.print(collector.characteristics());

它打印:

[IDENTITY_FINISH]

由于没有为收集器设置UNORDERED 特征,它将仅按顺序处理元素,这就是我所看到的行为。

事实上Collectors.toList()的文档中明确提到了这一点:

Returns:
a Collector which collects all the input elements into a List, in encounter order

关于java - 是否可以将有序收集器与并行流一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22578888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com