Параметры функции
Вернемся к примеру из предыдущего раздела:
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]
.
Ключевые моменты
Ключевые моменты:
- чтобы создать функциональную переменную, достаточно присвоить имя переменной функциональному литералу
- когда есть функция, с ней можно обращаться как с любой другой переменной, то есть как со
String
илиInt
переменной
А благодаря улучшенной функциональности Eta Expansion в Scala 3 с методами можно обращаться точно так же.
Ссылки: