Библиотека Scala поставляется с богатым набором классов коллекций, и эти классы содержат множество методов. Классы коллекций доступны как в неизменяемой, так и в изменяемой форме.
Создание списков
Чтобы дать вам представление о том, как они работают, вот несколько примеров, в которых используется класс List
,
являющийся неизменяемым классом связанного списка.
В этих примерах показаны различные способы создания заполненного List
:
val a = List(1, 2, 3) // a: List[Int] = List(1, 2, 3)
// методы Range
val b = (1 to 5).toList // b: List[Int] = List(1, 2, 3, 4, 5)
val c = (1 to 10 by 2).toList // c: List[Int] = List(1, 3, 5, 7, 9)
val e = (1 until 5).toList // e: List[Int] = List(1, 2, 3, 4)
val f = List.range(1, 5) // f: List[Int] = List(1, 2, 3, 4)
val g = List.range(1, 10, 3) // g: List[Int] = List(1, 4, 7)
Методы List
В следующих примерах показаны некоторые методы, которые можно вызывать для заполненного списка. Обратите внимание, что все эти методы являются функциональными, а это означает, что они не изменяют коллекцию, на которой вызываются, а вместо этого возвращают новую коллекцию с обновленными элементами. Результат, возвращаемый каждым выражением, отображается в комментарии к каждой строке:
// a sample list
val a = List(10, 20, 30, 40, 10) // List(10, 20, 30, 40, 10)
a.drop(2) // List(30, 40, 10)
a.dropWhile(_ < 25) // List(30, 40, 10)
a.filter(_ < 25) // List(10, 20, 10)
a.slice(2,4) // List(30, 40)
a.tail // List(20, 30, 40, 10)
a.take(3) // List(10, 20, 30)
a.takeWhile(_ < 30) // List(10, 20)
// flatten
val a = List(List(1,2), List(3,4))
a.flatten // List(1, 2, 3, 4)
// map, flatMap
val nums = List("one", "two")
nums.map(_.toUpperCase) // List("ONE", "TWO")
nums.flatMap(_.toUpperCase) // List('O', 'N', 'E', 'T', 'W', 'O')
Эти примеры показывают, как методы “foldLeft” и “reduceLeft” используются для суммирования значений в последовательности целых чисел:
val firstTen = (1 to 10).toList // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
firstTen.reduceLeft(_ + _) // 55
firstTen.foldLeft(100)(_ + _) // 155 (100 является “начальным” значением)
Для классов коллекций Scala доступно гораздо больше методов, и они продемонстрированы в главе “Коллекции” и в API документации.
Кортежи
В Scala кортеж (tuple) — это тип, позволяющий легко поместить набор различных типов в один и тот же контейнер.
Например, используя данный case класс Person
:
case class Person(name: String)
Вот как вы создаете кортеж, который содержит Int
, String
и пользовательское значение Person
:
val t = (11, "eleven", Person("Eleven"))
Когда у вас есть кортеж, вы можете получить доступ к его значениям, привязав их к переменным, или получить к ним доступ по номеру:
t(0) // 11
t(1) // "eleven"
t(2) // Person("Eleven")
Вы также можете использовать этот метод извлечения, чтобы присвоить поля кортежа именам переменных:
val (num, str, person) = t
// в результате:
// val num: Int = 11
// val str: String = eleven
// val person: Person = Person(Eleven)
Кортежи хороши в тех случаях, когда вы хотите поместить коллекцию разнородных типов в небольшую структуру, похожую на коллекцию. Дополнительные сведения о кортежах см. “в справочной документации”.
Contributors to this page:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java