从上一节回到这个例子:
val doubledInts = ints.map((i: Int) => i * 2)
我们注意到这部分表达式是一个匿名函数:
(i: Int) => i * 2
它被称为 匿名 的原因是它没有分配给变量,因此没有名称。
但是,可以将匿名函数(也称为函数字面量)分配给变量以创建函数变量:
val double = (i: Int) => i * 2
这将创建一个名为 double
的函数变量。 在这个表达式中,原始函数字面量在 =
符号的右侧:
val double = (i: Int) => i * 2 -----------------
新变量名在左侧:
val double = (i: Int) => i * 2 ------
并且函数的参数列表在此处加下划线:
val double = (i: Int) => i * 2 --------
就像方法的参数列表一样,这意味着 double
函数有一个参数,一个名为 i
的 Int
。 你可以在 REPL 中看到 double
的类型为 Int => Int
,这意味着它接受一个 Int
参数并返回一个 Int
:
scala> val double = (i: Int) => i * 2 val double: Int => Int = ...
调用函数
现在你可以像这样调用double
函数:
val x = double(2) // 4
您还可以将 double
传递给 map
调用:
List(1, 2, 3).map(double) // List(2, 4, 6)
此外,当您有 Int => Int
类型的其他函数时:
val triple = (i: Int) => i * 3
您可以将它们存储在 List
或 Map
中:
val functionList = List(double, triple) val functionMap = Map( "2x" -> double, "3x" -> triple )
如果将这些表达式粘贴到 REPL 中,您会看到它们具有以下类型:
// a List that contains functions of the type `Int => Int` functionList: List[Int => Int] // a Map whose keys have the type `String`, and whose // values have the type `Int => Int` functionMap: Map[String, Int => Int]
关键点
这里的重要部分是:
- 要创建函数变量,只需将变量名分配给函数字面量
- 一旦你有了一个函数,你可以像对待任何其他变量一样对待它,即像一个
String
或Int
变量
并且由于 Scala 3 中改进的 Eta Expansion 函数式,您可以以相同的方式处理 方法。