匿名函数

匿名函数是已定义但未分配名称的函数。

以下是一个匿名函数,它接受两个整数并返回总和。

(x: Int, y: Int) => x + y

结果表达式可以分配给 val

val sum = (x: Int, y: Int) => x + y

匿名函数主要用作其他函数的参数。例如,集合上的 map 函数需要另一个函数作为其参数:

// Returns Seq("FOO", "BAR", "QUX")
Seq("Foo", "Bar", "Qux").map((x: String) => x.toUpperCase)

可以省略匿名函数的参数类型 : 自动推断类型 :

Seq("Foo", "Bar", "Qux").map((x) => x.toUpperCase)

如果只有一个参数,则可以省略该参数周围的括号:

Seq("Foo", "Bar", "Qux").map(x => x.toUpperCase)

强调速记

有一个更短的语法,不需要参数的名称。上面的代码片段可以写成:

Seq("Foo", "Bar", "Qux").map(_.toUpperCase)

_ 在位置上表示匿名函数参数。对于具有多个参数的匿名函数,_ 的每次出现都将引用不同的参数。例如,以下两个表达式是等效的:

// Returns "FooBarQux" in both cases
Seq("Foo", "Bar", "Qux").reduce((s1, s2) => s1 + s2)
Seq("Foo", "Bar", "Qux").reduce(_ + _)

使用此简写时,由位置 _ 表示的任何参数只能以相同的顺序引用一次。

没有参数的匿名函数

要为不带参数的匿名函数创建值,请将参数列表留空:

val sayHello = () => println("hello")