一.常見的幾種形式
方法中用函數做參數
def m1(函數名:(參數類型...) => 返回值) : Int = {
}
函數的定義
(形參名:類型...) => 函數體
函數定義常見形式
val f1 = (x:Int,y:Int) => x + y
函數類型的變量
val a:(函數參數類型) =>返回值類型 = 函數名
二.方法和函數的區別
1.函數可作為一個參數傳入到方法中,而方法不行,通常情況下方法名可以作為參數,這是因為編譯器會自動將方法轉換成函數,但是仍然不可以說方法可以作為參數
def m1(f: (Int, Int) => Int): Int = { f(2, 6) } val f1 = (x: Int, y: Int) => x + y def f2(x: Int, y: Int): Int = { x - y } def main(args: Array[String]): Unit = { println(m1(f1)) //正確 println(m1(f2()) //編譯錯誤 println(m1(f2)) //正確 }
2.在Scala中無法直接操作方法(菜鳥上這樣寫的,不明所以),如果要操作方法,必須先將其轉換成函數。有兩種方法可以將方法轉換成函數
val f1 = m _
在方法名稱m后面緊跟一個空格和下划線告訴編譯器將方法m轉換成函數,而不是要調用這個方法。 也可以顯示地告訴編譯器需要將方法轉換成函數
val f1: (Int) => Int = m
函數類型的變量f1 如果我們直接把一個方法賦值給變量會報錯。如果我們指定變量的類型就是函數,編譯可以通過
3.函數必須要有參數列表,而方法可以沒有參數列表
4.可以把一個函數賦值給變量,但是不可以把一個方法給變量
val f = m _ val f1: (Int) => Int = m val f2 = m //報錯