在剛開始學 Kotlin 後就知道有這個功能,覺得滿酷的。其實 lambdab 表達式從 Java 8 開始也有
不過在這之前,要先來看看高階函數
底下是一個在正常的方法,有兩個參數跟回傳值
fun plus(num1: Int, num2: Int): Int{
return num1+ num2
}
當一個 function 只有 return 值時,可以寫在等號後方表示
fun plus(num1: Int, num2: Int): Int = num1+ num2
而 Kotlin 的 function 不只有這種表示型態。
他可以像變數一樣的型態表示
val plus = fun (num1: Int, num2: Int): Int = num1+ num2
在使用上,也和一般的 function 差不多
textView.text= plus(5, 7).toString()
有了這個概念,就可以來做「高階函數」。
所謂的高階函數,就是輸入參數或是回傳值是 function。
馬上建立一個高階函數作為例子:
fun calculate(
num1: Int,
num2: Int,
operator: (Int, Int) -> Int
): String{
return "The answer is ${operator(num1, num2)}."
}
他有三個參數,分別是兩個 Int 跟 一個回傳 Int 且需要兩個 Int 為參數的 function
而這符合剛剛 plus 的資料型態,所以最後會變成這樣
textView.text= calculate(5, 7, plus)
回傳答案:The answer is 12.
如此一來,我再寫一個同樣型態的 function type
val minus = fun (num1: Int, num2: Int): Int = num1- num2
就可以用在同一個高階函數裡面使用
val ans1= calculate(5, 3, plus)
val ans2= calculate(5, 3, minus)
Lambda function 可以將 function 簡化,且被大括號所包覆。
{參數名稱: 參數型態 -> 方法內容}
參數型態可寫可不寫要看情況決定
舉上面的計算機做為例子,建立個型態為 function 的變數:
val plus= { num1: Int, num2: Int ->
num1+ num2
}
其形態為「(Int, Int) -> Int
」,輸入兩個整數,回傳一個整數。
所以也可以這樣寫
val plus: (Int, Int) -> Int= { num1, num2 ->
num1+ num2
}
在上一節做的點擊監聽器會發現,他會要我們轉成 lambda
也就是上面的那個 {...}
的方法
轉完後就只剩下這樣,簡潔有力
btn.setOnClickListener {
TODO("Not yet implemented")
}
在 lambda function 裡面,可以用 it 代表方法的參數。
之所以能轉是因為在 View.class
裡可以看到 OnClickListener
只有唯一一個 function。
所以可以說,這個 interface 就是為了 function 而活
換言之,如果這個 interface 有兩個以上的 function 就不能夠轉了。
interface MyClickListener : View.OnClickListener {
override fun onClick(p0: View?)
fun otherFunction()
}
隨手寫了一個 interface 加上 otherFunction,實現方法後,發現沒有出現轉換 lambda 的提示
btn.setOnClickListener(object : MyClickListener{
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
override fun otherFunction() {
}
})