ski*_*iwi 6 java parallel-processing java-8 java-stream
使用流计算笛卡尔积时,我可以并行生成它们,并按顺序使用它们,以下代码演示:
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);
Run Code Online (Sandbox Code Playgroud)
这将按顺序完美打印所有内容,现在考虑以下代码,我想将其添加到列表中,同时保留顺序.
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);
Run Code Online (Sandbox Code Playgroud)
现在它不按顺序打印!
鉴于我没有要求保留订单,这是可以理解的.
现在的问题是:有没有办法collect()
或有没有Collector
保留秩序?
当我执行你的代码时,我按顺序得到了输出。事实上,这两个代码得到了相同的输出。似乎Collector
返回的值Collectors.toList
已经排序,如以下代码所示:
Collector collector = Collectors.toList();
System.out.print(collector.characteristics());
Run Code Online (Sandbox Code Playgroud)
它打印:
[IDENTITY_FINISH]
Run Code Online (Sandbox Code Playgroud)
由于没有UNORDERED
为收集器设置特征,因此它将仅按顺序处理元素,这就是我所看到的行为。
事实上,这在文档中明确提到Collectors.toList()
:
返回:
aCollector
将所有输入元素按List
遇到顺序收集到 a 中
归档时间: |
|
查看次数: |
424 次 |
最近记录: |