Гарантируется ли foreach по определению для последовательного повторения коллекции предметов в Scala? - PullRequest
14 голосов
/ 25 февраля 2012

Гарантируется ли по определению foreach повторение предметной коллекции (если она определяет порядок) последовательно от самого первого до самого последнего (если не случайно прерванного) элемента?Нет ли каких-либо переключателей оптимизации компилятора, которые могли бы его затормозить (перемешать последовательность) или не планируют сделать обычную foreach параллельной в будущих версиях?

Ответы [ 2 ]

16 голосов
/ 25 февраля 2012

Foreach гарантированно будет последовательным для последовательных коллекций (то есть нормальной иерархии или для чего-либо, преобразованного .seq). Параллельная часть библиотеки коллекций (которую вы получаете из стандартной коллекции через .par или явно используя классы из collection.parallel) в значительной степени гарантированно не , чтобы оценить по порядку. Если вы хотите быть агностиком, вы можете использовать набор черт GenX (например, GenSeq); они не дают никаких гарантий ни в отношении порядка выполнения, ни в том, что работа будет выполняться параллельно.

2 голосов
/ 25 февраля 2012

В дополнение к ответу Рекса, foreach при GenTraversableOnce только гарантирует, что все элементы будут проходить итерацией, если вы не прервете его. Черты ниже в цепочке иерархии могут предоставить дополнительные гарантии, например:

  • TraversableOnce и его потомки гарантируют, что за один раз будет проходить только один элемент (не гарантируется GenTraversableOnce!).
  • Seq и потомки гарантируют, что элементы будут проходить в том порядке, в котором они хранятся в коллекции.

И так как вы спросили о параллели foreach ...

scala> (1 to 10).par foreach println
4
6
1
3
2
7
5
8
9
10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...