W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
Scala 提供了多種方法來簡化函數字面量中多余的部分,比如前面例子中 filter 方法中使用的函數字面量,完整的寫法如下:
(x :Int ) => x +1
首先可以省略到參數的類型,Scala 可以根據上下文推算出參數的類型,函數定義可以簡化為:
(x) => x +1
這個函數可以進一步去掉參數的括號,這里的括號不起什么作用:
x => x +1
Scala 還可以進一步簡化,Scala 允許使用“占位符”下劃線”_”來替代一個或多個參數,只要這個參數值函數定義中只出現(xiàn)一次,Scala編譯器可以推斷出參數。比如:
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)
可以看到簡化后的函數定義為 > 0,你可以這樣來理解,就像我們以前做過的填空題,“”為要填的空,Scala 來完成這個填空題,你來定義填空題。
有時,如果你使用_來定義函數,可能沒有提供足夠的信息給 Scala 編譯器,此時 Scala 編譯器將會報錯,比如,定義一個加法函數如下:
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 編譯器無法推斷出_的參數類型,就報錯了,但如果你給出參數的類型,依然可以使用_來定義函數,比如:
scala> val f = (_ :Int ) + ( _ :Int)
f: (Int, Int) => Int = <function2>
scala> f (5,10)
res1: Int = 15
因為替代的參數在函數體中只能出現(xiàn)一次,因此多個“_”代表多個參數。第一個“_”代表第一個參數,第二個“\”代表第二個參數,以此類推。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: