function 和method是兩個不同的概念 定義函數可以有三種方式 1。 val 名稱 : (輸入參數類型列表)=>返回類型 = (輸入參數列表) => 函數定義 例如 val add : (Int,Int)=>Int = (x,y) => x+y 2。 val 名稱 = (輸入參數和類型列表) => 函數定義 例如 val add = (x:Int,y:Int) => x+y 3。 def 名稱(輸入參數和類型列表):返回類型 = 函數定義 例如 def add(x:Int,y:Int):Int = x+y 我最喜歡第二種定義方法,簡明扼要給人"更函數" 的感覺,但是遞歸函數只能用第一種和第三種,通過反編譯代碼發現 第三種方法定義的函數實現效率最高,因為它對應的 java 代碼仍然是簡單的函數而第一種和第二種被編譯成一個FunctionN對象 然後你定義的函數對應到這個對象的一個 apply 方法。 Ref: http://www.scalacn.com/portal.php?mod=view&aid=4 對於第一種可以顯示的使用FunctionN的寫法: val add:Function2[Int,Int,Int]=(x,y)=>x+y //FunctionN中的N表示參數的個數,類型列表最後一個表示返回值的類型 也可以把函數類型提取出來: type twoIntOpFn=(Int,Int)=>Int //twoIntOpFn為函數類型別名 val add:twoIntOpFn=(x,y)=>x+y add(1,2) //3 object add { def apply(x: Int, y: Int): Int = {x+y} } object add extends ((Int,Int) => Int) { def apply(x: Int, y: Int): Int = {x+y} } object add extends Function2[Int,Int,Int] { def apply(x: Int, y: Int): Int = {x+y} } |
C061.函數式編程(FP) > 01.函數值(Function Values) >