foreach定义是否保证在Scala中按顺序迭代主题集合?

时间:2012-02-24 23:30:14

标签: scala collections foreach parallel-processing

foreach by-definition是否保证从第一个到最后一个(除非意外中断)元素按顺序迭代主题集合(如果它定义顺序)?是不是有任何编译器优化开关可以制动它(洗牌顺序)或计划在未来版本中使普通foreach并行?

2 个答案:

答案 0 :(得分:16)

对于顺序集合(即正常层次结构,或由.seq转换的任何内容,保证Foreach是顺序)。集合库的并行部分(通过.par从标准集合中获取或通过显式使用collection.parallel中的类)得到很好的保证按顺序进行评估。如果您想要不可知,可以使用GenX一组特征(例如GenSeq);这些都不能保证执行顺序或工作将并行完成。

答案 1 :(得分:2)

为了补充Rex的答案,foreach GenTraversableOnce只保证所有元素都会被迭代,除非你打断它。层次结构链上较低的特征可以提供额外的保证,例如:

  • TraversableOnce和后代保证一次只能迭代一个元素(GenTraversableOnce无法保证!)。
  • Seq和后代保证元素将按照它们保存在集合中的顺序遍历。

因为您询问了并行foreach ...

scala> (1 to 10).par foreach println
4
6
1
3
2
7
5
8
9
10