Типы коллекций
В этом разделе продемонстрированы наиболее распространенные типы коллекций и их методы. В конце этого раздела для получения более подробной информации представлены дополнительные ссылки для более глубокого изучения коллекций.
Три основные категории коллекций
Для коллекций Scala можно выделить три основные категории:
- Последовательности (Sequences/Seq) представляют собой последовательный набор элементов и могут быть индексированными (как массив) или линейными (как связанный список)
- Карты (Maps) содержат набор пар ключ/значение, например Java
Map
, Python dictionary или RubyHash
- Множества (Sets) — это неупорядоченный набор уникальных элементов
Все они являются базовыми типами и имеют подтипы для конкретных целей, таких как параллелизм (concurrency), кэширование (caching) и потоковая передача (streaming). В дополнение к этим трем основным категориям существуют и другие полезные типы коллекций, включая диапазоны (ranges), стеки (stacks) и очереди (queues).
Иерархия коллекций
В качестве краткого обзора следующие три рисунка показывают иерархию классов и трейтов в коллекциях Scala.
На первом рисунке показаны типы коллекций в пакете scala.collection
.
Все это высокоуровневые абстрактные классы или трейты, которые обычно имеют неизменяемые и изменяемые реализации.
На этом рисунке показаны все коллекции в пакете scala.collection.immutable
:
А на этом рисунке показаны все коллекции в пакете scala.collection.mutable
:
В следующих разделах представлены некоторые из распространенных типов.
Общие коллекции
Основные коллекции, используемые чаще всего:
Тип коллекции | Неизменяемая | Изменяемая | Описание |
---|---|---|---|
List |
✓ | Линейная неизменяемая последовательность (связный список) | |
Vector |
✓ | Индексированная неизменяемая последовательность | |
LazyList |
✓ | Ленивый неизменяемый связанный список, элементы которого вычисляются только тогда, когда они необходимы; подходит для больших или бесконечных последовательностей. | |
ArrayBuffer |
✓ | Подходящий тип для изменяемой индексированной последовательности | |
ListBuffer |
✓ | Используется, когда вам нужен изменяемый список; обычно преобразуется в List |
|
Map |
✓ | ✓ | Итерируемая коллекция, состоящая из пар ключей и значений |
Set |
✓ | ✓ | Итерируемая коллекция без повторяющихся элементов |
Как показано, Map
и Set
бывают как неизменяемыми, так и изменяемыми.
Основы каждого типа демонстрируются в следующих разделах.
В Scala буфер, такой какArrayBuffer
илиListBuffer
, представляет собой последовательность, которая может увеличиваться и уменьшаться.
Примечание о неизменяемых коллекциях
В последующих разделах всякий раз, когда используется слово immutable, можно с уверенностью сказать, что тип предназначен для использования в стиле функционального программирования (ФП). С помощью таких типов коллекция не меняется, а при вызове функциональных методов возвращается новый результат - новая коллекция.
Выбор последовательности
При выборе последовательности нужно руководствоваться двумя основными вопросами:
- должна ли последовательность индексироваться (как массив), обеспечивая быстрый доступ к любому элементу, или она должна быть реализована как линейный связанный список?
- необходима изменяемая или неизменяемая коллекция?
Рекомендуемые универсальные последовательности:
Тип \ Категория | Неизменяемая | Изменяемая |
---|---|---|
индексируемая | Vector |
ArrayBuffer |
линейный связанный список | List |
ListBuffer |
Например, если нужна неизменяемая индексированная коллекция, в общем случае следует использовать Vector
.
И наоборот, если нужна изменяемая индексированная коллекция, используйте ArrayBuffer
.
List
иVector
часто используются при написании кода в функциональном стиле.ArrayBuffer
обычно используется при написании кода в императивном стиле.ListBuffer
используется, когда стили смешиваются, например, при создании списка.
Следующие несколько разделов кратко демонстрируют типы List
, Vector
и ArrayBuffer
.
Подробнее
Для дополнительной информации о коллекциях, см. следующие ресурсы:
Ссылки: