Является ли foreach
by-definition гарантированным для последовательного итерации коллекции предметов (если она определяет порядок) от самого первого до последнего (если случайно не прерывается) элемента? Нет ли каких-либо переключателей оптимизации компилятора, которые могут его заблокировать (перетасовать последовательность) или планирует сделать обычную параллель foreach
в будущих версиях?
Является ли foreach by-definition гарантированным итерирование коллекции предметов последовательно в Scala?
Ответ 1
Foreach гарантированно будет последовательным для последовательных коллекций (то есть нормальной иерархии или для чего-либо, преобразованного с помощью .seq
). Параллельная часть библиотеки коллекций (которую вы получаете из стандартной коллекции через .par
или явно используя классы из collection.parallel
), в значительной степени гарантируется, что ее нельзя оценивать по порядку. Если вы хотите быть агностиком, вы можете использовать набор признаков GenX
(например, GenSeq
); они не дают никаких гарантий ни по исполнению, ни в том, что работа будет выполняться параллельно.
Ответ 2
Чтобы дополнить ответ Rex, foreach
at GenTraversableOnce
гарантирует, что все элементы будут пропущены, если вы не прервите его. Черты ниже по иерархической цепочке могут предоставить дополнительные гарантии, например:
-
TraversableOnce
и потомки гарантируют, что за один раз будет повторяться только один элемент (не гарантируетсяGenTraversableOnce
!). -
Seq
и потомки гарантируют, что элементы пройдут по порядку, который они хранят в коллекции.
И так как вы спросили о параллельном foreach
...
scala> (1 to 10).par foreach println
4
6
1
3
2
7
5
8
9
10