Parallel Stream toArray维护秩序

时间:2018-04-12 03:23:20

标签: java-8 java-stream collectors

我读到了关于维护输入列表顺序的并发收集器。因此,如果我使用收集器到ArrayList,它可以保证有序收集 还有序列表上的地图功能维持顺序 我在toArray

中找不到任何有关订单保存的文档
  

即使管道被约束产生的结果与流源的遭遇顺序一致(例如,IntStream.range(0,5).parallel()。map(x - > x * 2 ).toArray()必须产生[0,2,4,6,8]),不保证mapper函数应用于单个元素的顺序,或者在什么线程中为a执行任何行为参数给定元素。

所以

Stream.map(x->x).toArray()

产生有序结果?或者我应该使用收藏家。

1 个答案:

答案 0 :(得分:2)

the documentation中引用的部分已经通过示例说明,maptoArray都会维持遭遇顺序。

当你通过Stream API documentation时,你会发现它永远不会对维持遭遇顺序的操作做出明确的陈述,但反之亦然,它明确说明操作是什么时候无序或具有特殊政策,具体取决于订购状态。

  • 显然unordered()明确撤回遭遇订单
  • forEachfindAny不尊重遭遇订单
  • 如果两个输入流中至少有一个是无序的(有争议的行为,但就是这样),
  • Stream.concat会返回一个无序流。
  • Stream.generate()生成无序流
  • skiplimittakeWhiledropWhile尊重遭遇订单,这可能会导致并行执行中的重大性能损失
  • distinct()sorted()对于有序流是稳定的,distinct()在流无序时可能具有明显更好的并行性能
  • 如果收集器是无序的,则
  • collect(Collector)可能表现为无序,只有当收集器是并发的并且流是无序的时,操作将是并发的语句暗示了这一点。收集器是无序的。有关详细信息,我们必须引用Collector documentationthe builtin collectors

请注意,虽然操作count()allMatchanyMatchnoneMatch没有关于遭遇顺序的声明,但这些操作的语义意味着结果不应该依赖于遭遇顺序。