scala提供了多種方法來簡化函式字面量中多餘的部分,比如前面例子中filter方法中使用的函式字面量,完整的寫法如下:
(x :int ) => x +1首先可以省略到引數的型別,scala可以根據上下文推算出引數的型別,函式定義可以簡化為:
(x) => x +1這個函式可以進一步去掉引數的括號,這裡的括號不起什麼作用:
x => x +1scala 還可以進一步簡化,scala允許使用」佔位符」下劃線」_」來替代乙個或多個引數,只要這個引數值函式定義中只出現一次,scala編譯器可以推斷出引數。比如
scala> val somenumbers = list ( -11, -10, - 5, 0, 5, 10)可以看到簡化後的函式定義為 _ > 0 ,你可以這樣來理解,就像我們以前做過的填空題,「_」為要填的空,scala來完成這個填空題,你來定義填空題。somenumbers: list[int] = list(-11, -10, -5, 0, 5, 10)
scala> somenumbers.filter(_ >0)
res0: list[int] = list(5, 10)
有時,如果你使用_來定義函式,可能沒有提供足夠的資訊給scala編譯器,此時scala編譯器將會報錯,比如,定義乙個加法函式如下:
scala> val f = _ + _scala 編譯器無法推斷出_的引數型別,就報錯了,但如果你給出引數的型別,依然可以使用_來定義函式,比如::7: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
val f = _ + _
^:7: error: missing parameter type for expanded function ((x$1: , x$2) => x$1.$plus(x$2))
val f = _ + _
scala> val f = (_ :int ) + ( _ :int)因為_替代的引數在函式體中只能出現一次,因此多個「_」代表多個引數。第乙個「_」代表第乙個引數,第二個「_」代表第二個引數,以此類推。f: (int, int) => int = scala> f (5,10)
res1: int = 15
Scala函式字面量
scala中函式為頭等公民,你不僅可以定義乙個函式然後呼叫它,而且你可以寫乙個未命名的函式字面量,然後可以把它當成乙個值傳遞到其它函式或是賦值給其它變數。下面的例子為乙個簡單的函式字面量 參考整數字面量,3 為一整數字面量 x int x 1這是個函式字面量,它的功能為 1.符好 表示這個函式將符號...
字面量和整數字面量
字面量是指c c 源 中直接使用的常量,字面量的意思是 一眼看上去是什麼就是什麼 例如語句 int x 10 中10就是字面量,它相對於變數,只有乙個確定的值不能改變,這個值就是它看上去的值。c c 中的字面量有一下幾種 1.0和正整數,如10 123等 負整數不是字面量,因為加了 運算子 2.浮點...
應該廣泛使用case語句簡化函式字面量的實現
這篇文章很短,但足以單獨作為一篇文章存在,因為這裡介紹的這個scala程式設計技巧非常的實用和高效。在scala裡我們需要大量地編寫一些函式字面量作為引數傳遞給高階函式,而很多時候,被要求提供的函式字面量的引數是一些復合型別,比如tuple,在函式字面量的實現體中,往往第一步就是通過模式匹配從復合型...