Подтвердить что ты не робот

Является ли foreach by-definition гарантированным итерирование коллекции предметов последовательно в Scala?

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

4b9b3361

Ответ 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