這篇將帶大家了解 Kotlin 在函數 Function 的基本操作,函數 Function 在程式設計中扮演非常重要的角色,通常使用 function 會有以下好處:
Function 是我們為了能夠完成某項特定任務或可重新使用的程式碼區塊,在 Kotlin 中是使用 fun 關鍵字來定義一個函式,其定義格式可參考下圖與利用一個範例進行說明:
此範例建立一個 getSumValue
Function 進行兩數加總,在 main
function 進行呼叫並印出結果
fun main() {
val sum = getSumValue(1, 2) // 傳入參數 1 和 參數 2
println(sum) // 印出 3
}
fun getSumValue(x: Int, y: Int): Int {
val sum = x + y // 計算
return sum
}
Kotlin 在 Function 中提供預設函數參數值方法,假設我們想呼叫某一個函數,但不傳遞任何參數,此時就可以使用參數預設值作為函數的參數值,範例如下:
修改前一個範例,當我們沒有傳入任何參數給 getSumValue
方法時,照理應回傳 0
的結果,此時可設定兩個參數預設值為 0
fun main() {
val sum = getSumValue()
println(sum)
}
// 利用預設參數 x = 0, y = 0
fun getSumValue(x: Int = 0, y: Int = 0): Int {
val sum = x + y // 計算
return sum
}
在前面第一個範例中,我們會發現 Function 呼叫時,必須根據函式參數順序(x, y)進行參數傳遞,而 Kotlin 有提供「具名參數」方法,讓我們可以不用照著函數定義時的參數順序進行呼叫,而是呼叫時搭配參數名稱進行賦值呼叫,此作法可以讓我們的程式碼更清晰直觀,例如以下範例:
fun main() {
val sum = getSumValue(y = 20, x = 30) // 加入參數名稱就可以不用管實際函數參數順序
println(sum)
}
fun getSumValue(x: Int = 0, y: Int = 0): Int {
val sum = x + y // 計算
return sum
}
前面介紹的函數其實都是使用具名函數
來定義,使用此方法就必須賦予一個函數名稱,而匿名函數
則相反,不需要給予函數名稱,匿名函數
也可稱為 Lambda 運算式
,它通常具有以下特性:
return
關鍵字返回資料,則是會隱式自動回傳函數最後一行結果或運算式只有一個參數
的匿名函數中,可以使用 it
關鍵字進行呼叫表示該參數fun main() {
val data = arrayOf(1, 2, 3) // 原始資料
val multiply = {x: Int, y: Int -> x * y} // 提供一個乘法匿名函數,自動回傳最後一行運算式(x * y)
data.forEach { println(multiply(it, 3)) } // 只有一個參數時,可使用 it 代替 item 數值
// 印出 3 6 9
}
在 Kotlin 中支援 Higher - Order Function(高階函數)
方法,所謂高階函數是指我們可以將 Function 作為變數
來進行傳遞,或是 Function 的返回值是一個 Function 類型進行回傳
,此種特性也代表 Kotlin Function 是支援 First-class-object (第一類物件)函數
。
我們利用字串反轉應用為範例如下:
fun main() {
// 宣告反轉函數
val reverseMethod: (String) -> String = { text: String -> text.reversed() }
// 呼叫欲反轉字串與帶入反轉函數
val result: String = getReverseResult("字串反轉", reverseMethod)
println("反轉結果為: $result") // 反轉結果為: 轉反串字
}
// 傳入字串與 Function
fun getReverseResult(text: String, callMethod: (String) -> String): String {
return callMethod(text)
}
函數返回值為一個函數類型,可參考下面的範例:
fun main() {
val data = listOf(10, 11, 12, 13, 14, 15) // 定義一個數值 List
val dividedByTwo = data.filter(divide(2)) //被2整除的元素列表
val dividedByThree = data.filter(divide(3)) //被3整除的元素列表
// 印出「可被 2 整除的數值有: [10, 12, 14]」
println("可被 2 整除的數值有: $dividedByTwo")
// 印出「可被 3 整除的數值有: [12, 15]」
println("可被 3 整除的數值有: $dividedByThree")
}
// 傳入要除的數值,回傳則為一個函數 function,傳入一個數值判斷是否可整除(回傳 Boolean)
fun divide(number: Int): (Int) -> Boolean {
return { it: Int -> it % number == 0 }
}