Взаимные преобразования последовательных и параллельных коллекций
Любая последовательная коллекция может быть преобразована в свою параллельную альтернативу вызовом метода par, причем некоторые типы последовательных коллекций имеют прямой параллельный аналог. Для таких коллекций конвертация эффективна– она занимает постоянное время, так как и последовательная и параллельная коллекция представлены одной и той же структурой данных (за исключением изменяемых хэш-таблиц и хэш-множеств, преобразование которых требует больше времени в первый вызов метода par, тогда как последующие вызовы par занимают постоянное время). Нужно заметить, что если изменяемые коллекции делят одну лежащую в основе структуру данных, то изменения, сделанные в последовательной коллекции, будут видны в ее параллельной ответной части.
| Последовательные | Параллельные |
|---|---|
| изменяемые | |
Array |
ParArray |
HashMap |
ParHashMap |
HashSet |
ParHashSet |
TrieMap |
ParTrieMap |
| неизменяемые | |
Vector |
ParVector |
Range |
ParRange |
HashMap |
ParHashMap |
HashSet |
ParHashSet |
Другие коллекции, такие, как списки, очереди или потоки, последовательны по своей сути, в том смысле, что элементы должны выбираться один за другим. Такие коллекции преобразуются в свои параллельные альтернативы копированием элементов в схожую параллельную коллекцию. Например, односвязный список преобразуется в стандартную неизменяемую параллельную последовательность, то есть в параллельный вектор.
Любая параллельная коллекция может быть преобразована в её последовательный вариант вызовом метода seq. Конвертирование параллельной коллекции в последовательную эффективно всегда– оно занимает постоянное время. Вызов seq на изменяемой параллельной коллекции возвращает последовательную, которая отображает ту же область памяти– изменения, сделанные в одной коллекции, будут видимы в другой.
Преобразования между различными типами коллекций
Параллельные коллекции могут конвертироваться в другие типы коллекций, не теряя при этом своей параллельности. Например, вызов метода toSeq последовательное множество преобразует в обычную последовательность, а параллельное– в параллельную. Общий принцип такой: если есть параллельный вариант коллекции X, то метод toX преобразует коллекцию к типу ParX.
Ниже приведена сводная таблица всех методов преобразования:
| Метод | Тип возвращаемого значения |
|---|---|
toArray |
Array |
toList |
List |
toIndexedSeq |
IndexedSeq |
toStream |
Stream |
toIterator |
Iterator |
toBuffer |
Buffer |
toTraversable |
GenTraversable |
toIterable |
ParIterable |
toSeq |
ParSeq |
toSet |
ParSet |
toMap |
ParMap |