祝大家中秋佳節快樂~
昨天大致上介紹了基本的函式定義方法,今天要來說的是讓 Koltin 更強大的匿名函式 (包含Lambda 函式)、擴充函式。
匿名函式:可以使用匿名函式來定義沒有函式名稱的函式,並將其作為參數傳遞或返回。例如,我們可以定義一個匿名函式 sum
,用於計算兩個數字的和。
val sum = fun(x: Int, y: Int): Int {
return x + y
}
Lambda 函式:一種匿名函式的寫法,不同於一般匿名函式,省 fun
直接使用大括弧定義函式傳入以及回傳行為,下面是一個使用 Lambda 表達式完成上面的功能的範例:
val sum = { x: Int, y: Int -> x + y }
在這個例子中,{ x: Int, y: Int -> x + y }
就是一個 Lambda 表達式,表示接受兩個 Int
型參數 x
和 y
,並返回它們的和。
Lambda 函式也可以作為函式的參數,例如在 filter
函式中使用 Lambda 函式:
ints.filter { item -> item > 0 }
這個例子中,{ item -> item > 0 }
就是一個 Lambda 表達式,用於過濾 ints
列表中大於 0 的元素。
一般的匿名函式也可以作為函式的參數,如下:
ints.filter(fun(item) = item > 0)
擴充函式:允許在不修改原始型別程式碼的情況下新增函式的方法。這個功能提供了一種擴充外部庫或原生 Kotlin 型別功能的方式。
要擴充函式,需要先指定要擴充的型別,後跟一個點和擴充函式名。在擴充函式的內部,可以使用 this
關鍵字調度原始型別裡所帶的內容(值)。
以下是一範例為 String
型別新增一個 reverse
函式,目標是反轉原本 String
型別的字串:
fun String.reverse(): String {
return this.reversed()
}
通過這個擴充函式,現在就可以在任何 String
對象上呼叫 reverse
函式:
val str = "Hello, World!"
val reversedStr = str.reverse()
println(reversedStr) // 輸出: "!dlroW ,olleH"
擴充函式也可以有參數,這樣可以進一步靈活賦予它們的行為。以下是一個將字串截斷到指定的長度的範例:
fun String.truncate(length: Int): String {
return if (this.length > length) {
"${this.substring(0, length)}..."
}
val longStr = "This is a long string that needs to be truncated"
val truncatedStr = longStr.truncate(10)
println(truncatedStr) // Output: "This is a..."
此外,我們也可以對一個集合型別建立一個擴充函式,如下是對一個字串列表輸出所有元素的長度:
fun List<String>.getLength(): List<Int> =
this.map { str -> // 這裡的 str 是指列表中的單一個字串元素
str.size()
}