Рубрики
Без рубрики

Коллекции Scala в двух словах

Язык Scala, представляющий собой смесь парадигм объектно-ориентированного и функционального программирования, обладает довольно… Помеченный scala, java, jvm, функциональный.

Язык Scala, представляющий собой смесь парадигм объектно-ориентированного и функционального программирования, обладает совершенно уникальной структурой сбора данных по сравнению с некоторыми другими языками. Несмотря на то, что Scala во многом унаследовала мир Java и JVM, она имеет гораздо более простой и удобный API и в целом более отточена.

В этом посте я покажу вам ряд коллекций Scala, как использовать их с примерами кода и где их использовать. Наслаждайтесь!

Пакет(ы) для сбора Scala

Во-первых, давайте взглянем на пакеты, содержащие все коллекции Scala. Пакет верхнего уровня называется, как и следовало ожидать, – коллекция . Что еще интереснее, так это включенные в него подпакеты. Они содержат более специализированную версию типичных коллекций, адаптированную для конкретного случая использования.

Независимо от того, требуется ли вам параллельная обработка, параллельный доступ или просто хотите иметь обычный поиск по ключу – просто импортируйте нужный пакет, и все готово!

В таблице ниже представлено название подпакета коллекции , а также краткое описание того, что вы можете там найти.

Определяет базовые характеристики и объекты, необходимые для использования и расширения библиотеки коллекций Scala, включая все определения в подпакетах. Большинство абстракций, с которыми вы будете работать, определены здесь. коллекция
Определяет признак карты и класс древовидной карты с атомарными операциями доступа без блокировок. коллекция
Определяет типы для обертывания коллекций Scala абстракциями коллекций Java и обертывания коллекций Java абстракциями коллекций Scala коллекция
Определяет повторно используемые компоненты, используемые для создания конкретных изменяемых, неизменяемых и т.д. коллекций. коллекция
Определяет неизменяемые коллекции, которые вы будете использовать чаще всего. коллекция
Определяет изменяемые коллекции. Большинство конкретных типов коллекций доступны в изменяемых и неизменяемых формах, но не все. коллекция
Определяет повторно используемые компоненты, используемые для создания определенных изменяемых и неизменяемых коллекций, которые распределяют обработку по параллельным потокам коллекция
Определяет параллельные, неизменяемые коллекции. коллекция
Определяет параллельные изменяемые коллекции. коллекция
Устаревший пакет инструментов для наблюдения за операциями сбора. коллекция

Как видите, выбор вариантов очень широк. С одной стороны, всегда полезно иметь соответствующую коллекцию для любого варианта использования. С другой стороны, довольно сложно начать, если вы просто хотите реализовать простую Карту .

Для целей этого поста давайте сосредоточимся на наиболее широко используемых коллекциях – неизменяемый

Для целей этого поста давайте сосредоточимся на наиболее широко используемых коллекциях – || неизменяемый ||

Пакет неизменяемых коллекций является самым популярным из всех коллекций Scala. Фактически, этот пакет включен в область действия по умолчанию, поэтому мы можем начать использовать его без какого-либо импорта.

Этот пакет включает в себя множество функций и конкретных реализаций определенных структур данных. На изображении ниже показаны те (синий – это черта , а черный – класс ):

Источник: Документы Scala

Теперь давайте отложим это в сторону и действительно научимся использовать некоторые базовые коллекции. В следующих разделах основное внимание уделяется некоторым широко используемым реализациям, по одной за раз.

Набор

Первый в списке – Установить . Это коллекция, которая не содержит повторяющихся элементов. Если в коллекции есть только уникальные элементы, то вам следует выбрать именно их. Набор создается таким образом:

// Set of Char type
val set: Set[Char] = Set('a', 'b', 'c')

// Or just empty Set
val setOfInt: Set[Int] = Set()

Что интересного в операциях в Установить – это метод применить . Метод применить ведет себя как метод содержит – оба проверяют, содержит ли Набор данный элемент:

val set: Set[Int] = Set(1, 2, 5, 6, 9)

set.contains(2) // true
set(2) // same as above, returns true

Набор предлагает широкий спектр операций – полную справку можно найти здесь .

Где использовать Набор ?

  • Не нужны дубликаты
  • Нужно быстро проверить наличие элемента
  • Нет необходимости пересекать

Карта

Карта представляет собой набор пар ключ-значение. Каждому ключу присвоено соответствующее значение. Ключи должны быть уникальными, чтобы обеспечить O(1) время поиска. Значения, однако, не обязательно должны быть уникальными. Давайте посмотрим, как мы можем создать Карту :

// A Map of Int to String mapping
val map: Map[Int, String] = Map(1 -> "one", 2 -> "two", 3 -> "three")

// Or an empty Map
val emptyMap: Map[String, String] = Map()

Элементы в Карте создаются с использованием синтаксиса ключ -> значение , хотя вы также можете использовать (ключ, значение) если вы предпочитаете (хотя предпочтительнее первая версия).

Что интересно в Карте , так это то, как мы можем получить значение, используя ключ. Метод получения значения по умолчанию – метод get(ключ) . Этот метод, однако, возвращает Параметр[T] , а не Параметр . Это делается для того, чтобы учесть ситуацию, когда ключ не существует – вместо исключения возвращается параметр [Нет] . Если вы предпочитаете получать прямое значение, метод apply даст вам это (или исключение, если, конечно, ничего не найдено). Давайте посмотрим, как это выглядит:

val map: Map[Char, Int] = Map('I' -> 1, 'V' -> 5, 'X' -> 10)

map.get('I') // returns Option[Int]
map.get('D') // returns Option[None]

map('V') // returns 5
map('C') // throws exception

/| Карта предлагает широкий спектр операций - полную справку можно найти здесь .

Вы можете узнать больше о Опции в моем сообщении в блоге об этом.

Где использовать Карта ?

  • Требуется хранилище ключевых значений
  • Требуется O(1) поиск и извлечение
  • Порядок не важен
  • Дубликатов ключей не требуется

Вектор

Вектор представляет собой индексированную, упорядоченную и проходимую последовательность. Несмотря на то, что это звучит довольно сложно, это довольно популярная структура данных общего назначения, благодаря хорошему балансу между быстрым случайным выбором и быстрыми случайными функциональными обновлениями. Давайте посмотрим, как их использовать на практике:

// A Vector of Integers
val vector: Vector[Int] = Vector(1, 2, 3, 5, 7, 11)

// Or an empty Vector
val emptyVector: Vector[String] = Vector()

Метод применить для Вектора просто получает элемент и, используя и индекс в векторе. В этой структуре данных индекс должен быть между нулем и длиной вектора – в противном случае возникает исключение IndexOutOfBoundsException :

val vector: Vector[String] = Vector("one", "two", "three")

vector(0) // returns "one"
vector(3) // exception

A Вектор предлагает широкий спектр операций – полную ссылку можно найти здесь .

Где использовать Вектор ?

  • Нужен быстрый произвольный доступ и обновления
  • Нужны быстрые операции добавления/добавления/завершения
  • Должно быть проходимым
  • Вопросы заказа

Список

Последняя коллекция является самой простой и поэтому популярной среди простых вариантов использования – Список . Эта коллекция реализована в виде связанного списка, который представляет упорядоченные коллекции. Давайте посмотрим, как использовать Список :

// List of Strings
val list: List[String] = List("blue", "red", "yellow")

// Empty List
val emptyList: List[Int] = List()

Как упоминалось выше, Список реализован в виде связанного списка. Это означает, что мы можем создать список, используя оператор добавления :: и ноль, который представляет пустой список. Это можно сделать следующим образом:

// Same as example from above
val list: List[String] = "blue" :: ("red" :: ("yellow" :: Nil))

// And an empty List
val emptyList = Nil

/| Список предлагает широкий спектр операций - полную ссылку можно найти здесь .

Где использовать Список ?

  • Должны быть проходимыми
  • Необходимость O(1) добавления и считывания головного элемента
  • Может переносить O (n) добавление и считывание внутренних элементов
  • Не нужен произвольный доступ

Резюме

Я надеюсь, что вы нашли этот пост полезным. Если да, то не стесняйтесь ставить лайк или делиться этим постом. Кроме того, вы можете следить за мной в моих социальных сетях, если вам так хочется 🙂

Оригинал: “https://dev.to/bartoszgajda55/scala-collections-in-a-nutshell-o1o”