Scala 提供了多種方法來簡化函數(shù)字面量中多余的部分,比如前面例子中 filter 方法中使用的函數(shù)字面量,完整的寫法如下:
(x :Int ) => x +1
首先可以省略到參數(shù)的類型,Scala 可以根據(jù)上下文推算出參數(shù)的類型,函數(shù)定義可以簡化為:
(x) => x +1
這個(gè)函數(shù)可以進(jìn)一步去掉參數(shù)的括號,這里的括號不起什么作用:
x => x +1
Scala 還可以進(jìn)一步簡化,Scala 允許使用“占位符”下劃線”_”來替代一個(gè)或多個(gè)參數(shù),只要這個(gè)參數(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 來完成這個(gè)填空題,你來定義填空題。
有時(shí),如果你使用_來定義函數(shù),可能沒有提供足夠的信息給 Scala 編譯器,此時(shí) Scala 編譯器將會報(bào)錯(cuò),比如,定義一個(gè)加法函數(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ù)類型,就報(bào)錯(cuò)了,但如果你給出參數(shù)的類型,依然可以使用_來定義函數(shù),比如:
scala> val f = (_ :Int ) + ( _ :Int)
f: (Int, Int) => Int = <function2>
scala> f (5,10)
res1: Int = 15
因?yàn)?em>替代的參數(shù)在函數(shù)體中只能出現(xiàn)一次,因此多個(gè)“_”代表多個(gè)參數(shù)。第一個(gè)“_”代表第一個(gè)參數(shù),第二個(gè)“\”代表第二個(gè)參數(shù),以此類推。
更多建議: