为什么在Java 8中按顺序收集并行流

西萨赫济耶

为什么总是forEach以随机顺序打印数字,而collect始终从原始顺序收集元素,即使是从并行流中呢?

Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8};
List<Integer> listOfIntegers = new ArrayList<>(Arrays.asList(intArray));

System.out.println("Parallel Stream: ");
listOfIntegers
  .stream()
  .parallel()
  .forEach(e -> System.out.print(e + " "));
System.out.println();

// Collectors         
List<Integer> l = listOfIntegers
  .stream()
  .parallel()
  .collect(Collectors.toList());
System.out.println(l);

输出:

Parallel Stream: 
8 1 6 2 7 4 5 3 
[1, 2, 3, 4, 5, 6, 7, 8]
斯图尔特·马克斯

这里有两种不同的“排序”,使讨论变得混乱。

一种是遇到顺序,该顺序流文档中定义考虑这一点的一种好方法是源集合中元素空间顺序从左到右的顺序。如果源是List,请考虑将较早的元素放在后面的元素的左侧。

还有文档中未定义的处理时间顺序,但这是由不同线程处理元素的时间顺序。如果列表的元素由不同的线程并行处理,则线程可能在列表中最右边的元素之前处理最右边的元素。但是下次可能不会。

即使并行执行计算,大多数Collectors和某些终端操作也会精心安排,以便它们保留从源到目的地的遇到顺序,而与不同线程处理每个元素时间顺序无关

需要注意的是,forEach终端的操作并不能保留相遇秩序。相反,它由发生任何下一个结果的线程运行。如果您想要这样的东西forEach来保留相遇顺序,请forEachOrdered改用。

另请参阅Lambda常见问题解答,以进一步了解订购问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java的8个流 - 并行执行 - 不同的结果 - 为什么?

来自分类Dev

从Java 8中的流收集同步的arraylist

来自分类Dev

为什么错了?关于Java 8流

来自分类Dev

Java 8 流收集

来自分类Dev

Java的8流 - 为什么我不能总结整数流?

来自分类Dev

Java 8中的歧义方法,为什么?

来自分类Dev

Java中的并行流

来自分类Dev

在Java 8流中按属性排序

来自分类Dev

Java 8流收集集

来自分类Dev

Java 8中意外的并行流性能

来自分类Dev

Java 8中意外的并行流性能

来自分类Dev

为什么减少的结果对于顺序流和并行流不同?

来自分类Dev

如果并行处理,为什么在无限数量的数字流中按素数过滤会永久占用?

来自分类Dev

Java 8 | HashMap的并行流

来自分类Dev

Java8流的顺序执行和并行执行产生不同的结果?

来自分类Dev

为什么Java 8的功能样式结构称为“流”?

来自分类Dev

为什么此Java 8流示例无法编译?

来自分类Dev

为什么Java 8的功能样式结构称为“流”?

来自分类Dev

为什么不同流中的内核执行不并行?

来自分类Dev

为什么Java 8中的IntStream.range(0,n)不应该并行?

来自分类Dev

为什么Java仅按值传递?

来自分类Dev

我为什么要在Java中链流操作?

来自分类Dev

Java 中的流比原生 for 循环慢得多 - 为什么?

来自分类Dev

Drools为什么不使用Java 8?

来自分类Dev

Java的8可选。为什么和ofNullable?

来自分类Dev

为什么Java buildpath中的顺序很重要?

来自分类Dev

在Java中,为什么类“数组”是复数?

来自分类Dev

为什么在Java中“或”比“和”慢?

来自分类Dev

为什么ArrayList比Java中的HashSet快?