Scala 3 — Book

Функции первого класса

Language

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: