6

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

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秩序?

4

1 回答 1

4

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

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

它打印:

[IDENTITY_FINISH]

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

事实上,这在以下文档中明确提到Collectors.toList()

返回:
a将所有输入元素按遇到顺序Collector收集到 a中List

于 2014-03-22T14:54:52.853 回答