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