匿名函式
匿名函式是已定義但未分配名稱的函式。
以下是一個匿名函式,它接受兩個整數並返回總和。
(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")