iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0

這篇將帶大家了解 Kotlin 在函數 Function 的基本操作,函數 Function 在程式設計中扮演非常重要的角色,通常使用 function 會有以下好處:

  • 減少撰寫重複程式碼,提高程式維護性
  • 將程式碼以有意義的命名進行組織
  • 若有相同流程的行為,可藉由參數傳遞進行處理

函數定義

Function 是我們為了能夠完成某項特定任務或可重新使用的程式碼區塊,在 Kotlin 中是使用 fun 關鍵字來定義一個函式,其定義格式可參考下圖與利用一個範例進行說明:

https://ithelp.ithome.com.tw/upload/images/20200914/20121179arGftABTNX.png

此範例建立一個 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
}

匿名函數 Anonymous Function

前面介紹的函數其實都是使用具名函數來定義,使用此方法就必須賦予一個函數名稱,而匿名函數則相反,不需要給予函數名稱,匿名函數也可稱為 Lambda 運算式,它通常具有以下特性:

  1. 此函數不需要 return 關鍵字返回資料,則是會隱式自動回傳函數最後一行結果或運算式
  2. 在定義只有一個參數的匿名函數中,可以使用 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
}

高階函數 Higher-Order Functions

在 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 }
}

上一篇
[Day 04] 遠征 Kotlin × 流程控制
下一篇
[Day 06] 遠征 Kotlin × Collections 介紹
系列文
30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言