Java 可以将有序收集器与并行流一起使用吗?

Java 可以将有序收集器与并行流一起使用吗?,java,parallel-processing,java-8,java-stream,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)) .forEac

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

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);
intmin=0;
int max=9;
Supplier=()->IntStream.rangeClosed(最小,最大).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);
intmin=0;
int max=9;
Supplier=()->IntStream.rangeClosed(最小,最大).parallel();
List=供应商。get()
.flatMap(a->supplier.get().map(b->a*b))
.boxed()
.collect(Collectors.toList());
list.forEach(System.out::println);
现在它没有按顺序打印
这是可以理解的,因为我没有要求维持秩序


现在的问题是:有没有一种方法来收集()或者有没有一个保存顺序的收集器?

当我执行你的代码时,我的输出是有序的。事实上,这两个代码的输出是相同的。似乎从
收集器返回的
收集器
。toList
已经订购,如下代码所示:

Collector collector = Collectors.toList();
System.out.print(collector.characteristics());
它打印:

[IDENTITY_FINISH]
由于没有为收集器设置无序的特征,它将只按顺序处理元素,这就是我看到的行为

事实上,以下文件中明确提到了这一点:

返回:
一种
采集器
,它按遇到顺序将所有输入元素收集到
列表


为什么不事先创建列表和
.forEachOrdered(i->list.add(i))
?@fge如果破坏了
采集器的某些用途,我也不会对正常的顺序采集器这样做。这只会按顺序给我输出:-/你是对的,我一定是在几天前误读了它,因为我再次测试,它正在按顺序执行。这里的确认肯定是a+1。