Параметры функции

Вернемся к примеру из предыдущего раздела:

val doubledInts = ints.map((i: Int) => i * 2)

Анонимной функцией является следующая часть: (i: Int) => i * 2

Причина, по которой она называется анонимной (anonymous), заключается в том, что она не присваивается переменной и, следовательно, не имеет имени.

Однако анонимная функция, также известная как функциональный литерал (function literal), может быть назначена переменной для создания функциональной переменной (function variable):

val double = (i: Int) => i * 2

Код выше создает функциональную переменную с именем double. В этом выражении исходный литерал функции находится справа от символа =, а новое имя переменной - слева. Список параметров функции подчеркнут:

val double = (i: Int) => i * 2
             --------

Как и список параметров для метода, список параметров функции означает, что функция double принимает один параметр с типом Int и именем i. Как можно видеть ниже, double имеет тип Int => Int, что означает, что он принимает один параметр Int и возвращает Int:

val double = (i: Int) => i * 2
// double: Int => Int = ...

Вызов метода

Функция double может быть вызвана так:

val double = (i: Int) => i * 2
val x = double(2)
// x: Int = 4

double также можно передать в вызов map:

List(1, 2, 3).map(double)
// res0: List[Int] = List(2, 4, 6)

Кроме того, когда есть другие функции типа Int => Int:

val triple = (i: Int) => i * 3

можно сохранить их в List или Map:

val functionList: List[Int => Int] = List(double, triple)
val functionMap: Map[String, Int => Int] = Map(
  "2x" -> double,
  "3x" -> triple
)

functionList имеет тип List[Int => Int], functionMap - Map[String, Int => Int].

Ключевые моменты

Ключевые моменты:

А благодаря улучшенной функциональности Eta Expansion в Scala 3 с методами можно обращаться точно так же.


Ссылки: