跳轉到內容

Scala/函式字面量

來自華夏公益教科書,開放的書籍,為開放的世界

通常情況下,函式只定義一次就使用。由於它只定義一次,給它命名就顯得有點多餘。為了避免重複命名和使用一次性函式,存在一個方法可以完全避免為它們命名。這些被稱為匿名函式或函式字面量。一個簡單的例子是將一個函式轉換為匿名版本

def isEqualToFour(a:Int) = a == 4
(a:Int) => a == 4

上面兩個函式實際上是一樣的,除了第二個函式沒有名字。但是上面的例子並不令人興奮。所以讓我們在更高階函式中應用它,看看它的實際效果

val list = List(1, 2, 3, 4)

list.exists(isEqualToFour)

list.exists((a:Int) => a == 4)

簡短了不少,因為之前我們必須寫兩次“isEqualToFour”,並使用一個“def”。但它可以更短。由於函式字面量是在一個函式內部使用的,Scala編譯器可以推斷出引數型別

list.exists(a => a == 4)

好多了。但是“a”基本上是一個一次性名字。在更高階函式內部使用函式字面量時,你可以直接寫一個使用“_”作為引數的表示式,而不是定義引數

list.exists(_ == 4)

這個版本儘可能簡潔。使用“_”的規則是:第一次使用“_”指的是第一個引數,第二次使用“_”指的是第二個引數,以此類推。所以下面的例子就不行了,因為函式字面量期望只接受一個引數,但兩次使用“_”意味著函式字面量有兩個引數

list.exists(a => a*a == 4) //Compiles fine.
//list.exists(_*_ == 4) //ERROR: Does not compile!
華夏公益教科書