Гарантируется ли по определению, что 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