Scala обладает большинством возможностей, которые вы ожидаете от функционального языка программирования, в том числе:
- Lambdas (анонимные функции)
- Функции высшего порядка (HOF)
- Неизменяемые коллекции в стандартной библиотеке
Лямбда-выражения, также известные как анонимные функции, играют важную роль в том, чтобы ваш код был кратким, но удобочитаемым.
Метод map
класса List
является типичным примером функции высшего порядка —
функции, которая принимает функцию в качестве параметра.
Эти два примера эквивалентны и показывают, как умножить каждое число в списке на 2
, передав лямбда в метод map
:
val a = List(1, 2, 3).map(i => i * 2) // List(2,4,6)
val b = List(1, 2, 3).map(_ * 2) // List(2,4,6)
Примеры выше также эквивалентны следующему коду, в котором вместо лямбда используется метод double
:
def double(i: Int): Int = i * 2
val a = List(1, 2, 3).map(i => double(i)) // List(2,4,6)
val b = List(1, 2, 3).map(double) // List(2,4,6)
Если вы еще раньше не видели метод
map
, он применяет заданную функцию к каждому элементу в списке, создавая новый список, содержащий результирующие значения.
Передача лямбда-выражений функциям высшего порядка в классах коллекций (таких, как List
) —
это часть работы со Scala, которую вы будете делать каждый день.
Неизменяемые коллекции
Когда вы работаете с неизменяемыми коллекциями, такими как List
, Vector
,
а также с неизменяемыми классами Map
и Set
, важно знать,
что эти функции не изменяют коллекцию, для которой они вызываются;
вместо этого они возвращают новую коллекцию с обновленными данными.
В результате также принято объединять их вместе в “свободном” стиле для решения проблем.
Например, в этом примере показано, как отфильтровать коллекцию дважды, а затем умножить каждый элемент в оставшейся коллекции:
// пример списка
val nums = (1 to 10).toList // List(1,2,3,4,5,6,7,8,9,10)
// методы могут быть сцеплены вместе
val x = nums.filter(_ > 3)
.filter(_ < 7)
.map(_ * 10)
// result: x == List(40, 50, 60)
В дополнение к функциям высшего порядка, используемым в стандартной библиотеке, вы также можете создавать свои собственные функции.
Contributors to this page:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java