Published 2025-06-12
Extension Functions in Kotlin
扩展函数适用于在不修改现有类的情况下,为类添加新功能。Kotlin 的扩展函数允许你在类外部定义函数,这些函数可以像成员函数一样调用。
在此之前需要了解接收器类型(Receiver Type)和接收器对象(Receiver Object)
接收器类型
接收器类型是扩展函数的第一个参数类型,它指定了扩展函数可以被调用的对象类型。接收器类型决定了扩展函数可以访问哪些属性和方法。
fun String.printWithPrefix(prefix: String) {
println("$prefix $this")
}
在这个例子中,String
是接收器类型,printWithPrefix
是扩展函数。
接收器对象
接收器对象是调用扩展函数时的实际对象。它是扩展函数的隐式参数,可以直接访问接收器类型的属性和方法。
val message = "Hello, Kotlin"
message.printWithPrefix("Greeting:") // 输出 "Greeting: Hello, Kotlin"
定义扩展函数
扩展函数的定义语法如下:
fun ReceiverType.functionName(parameters): ReturnType {
// 函数体
}
例如,定义一个扩展函数来计算字符串的字节长度:
fun String.byteLength(): Int {
return this.toByteArray().size
}
使用这个扩展函数:
val text = "Hello, Kotlin"
val length = text.byteLength() // 输出 13
扩展函数案例
class HttpClient {
fun request(method:String,url: String,headers:Map<String,String>): HttpResponse {
return HttpResponse(200,"OK")
}
}
fun HttpClient.get(url: String, headers: Map<String, String> = emptyMap()): HttpResponse {
return request("GET", url, headers)
}
fun HttpClient.post(url: String, body: String, headers: Map<String, String> = emptyMap()): HttpResponse {
return request("POST", url, headers)
}
fun main() {
val client = HttpClient()
val response = client.get("https://example.com")
println(response.status) // 输出 200
}
练习
- 定义一个扩展函数
List<Int>.sum()
,返回列表中所有整数的和。
fun List<Int>.sum(): Int {
var total = 0
for (num in this) {
total += num
}
return total
}
val numbers = listOf(1, 2, 3, 4, 5)
val total = numbers.sum() // 输出 15
println(total)
- 定义一个扩展函数
String.isPalindrome()
,检查字符串是否是回文。
fun String.isPalindrome(): Boolean {
val cleaned = this.replace("\\s".toRegex(), "").lowercase()
return cleaned == cleaned.reversed()
}
val word = "level"
val isPalindrome = word.isPalindrome() // 输出 true
println(isPalindrome)
Comments
No Comments!