匿名函式

匿名函式是已定義但未分配名稱的函式。

以下是一個匿名函式,它接受兩個整數並返回總和。

(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")