Гарантируется ли по определению, что foreach последовательно повторяет коллекцию subject в Scala?

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

2 ответов


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


в дополнение к ответу Рекса,foreach at GenTraversableOnce только гарантирует, что все элементы будут повторяться, если вы не прервете его. Признаки, расположенные ниже по иерархии, могут предоставить дополнительные гарантии, например:

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

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

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