Scala 函數(shù)–函數(shù)字面量的一些簡化寫法

2018-09-28 18:24 更新

函數(shù)–函數(shù)字面量的一些簡化寫法

Scala 提供了多種方法來簡化函數(shù)字面量中多余的部分,比如前面例子中 filter 方法中使用的函數(shù)字面量,完整的寫法如下:

 (x :Int ) => x +1

首先可以省略到參數(shù)的類型,Scala 可以根據(jù)上下文推算出參數(shù)的類型,函數(shù)定義可以簡化為:

 (x) => x +1

這個函數(shù)可以進一步去掉參數(shù)的括號,這里的括號不起什么作用:

 x => x +1

Scala 還可以進一步簡化,Scala 允許使用“占位符”下劃線”_”來替代一個或多個參數(shù),只要這個參數(shù)值函數(shù)定義中只出現(xiàn)一次,Scala編譯器可以推斷出參數(shù)。比如:

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.filter(_ >0)
res0: List[Int] = List(5, 10)

可以看到簡化后的函數(shù)定義為 > 0,你可以這樣來理解,就像我們以前做過的填空題,“”為要填的空,Scala 來完成這個填空題,你來定義填空題。

有時,如果你使用_來定義函數(shù),可能沒有提供足夠的信息給 Scala 編譯器,此時 Scala 編譯器將會報錯,比如,定義一個加法函數(shù)如下:

scala> val f = _ + _
<console>:7: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
       val f = _ + _
               ^
<console>:7: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
       val f = _ + _

Scala 編譯器無法推斷出_的參數(shù)類型,就報錯了,但如果你給出參數(shù)的類型,依然可以使用_來定義函數(shù),比如:

scala> val f = (_ :Int ) + ( _ :Int)
f: (Int, Int) => Int = <function2>
scala> f (5,10)
res1: Int = 15

因為替代的參數(shù)在函數(shù)體中只能出現(xiàn)一次,因此多個“_”代表多個參數(shù)。第一個“_”代表第一個參數(shù),第二個“\”代表第二個參數(shù),以此類推。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號