⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Kotlin 扩展函数

Kotlin 扩展函数深度解析 · 难度:进阶 · +15XP

Kotlin 扩展函数深度解析

扩展函数是Kotlin最强大的特性之一,它允许你在不继承类的情况下,给已有类添加新的函数。无论是标准库中的类(如String、Int),还是第三方库中的类,都可以通过扩展函数来增强功能,让代码更简洁、可读性更高。

基本语法

// 语法:fun 接收者类型.函数名(参数): 返回值 { 函数体 }
// "接收者类型"就是要扩展的类,函数体内用this访问实例

// 为String添加扩展函数 fun String.addExclamation(): String { return this + "!" }

fun main() { val s = "Hello" println(s.addExclamation()) // Hello! println("Kotlin".addExclamation()) // Kotlin! }

// 调用时就像调用类自带的成员函数一样!

常用扩展函数示例

// 1. 为String添加实用方法
fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

fun String.maskMiddle(start: Int = 2, end: Int = 2): String { if (length <= start + end) return this return this.take(start) + "*".repeat(length - start - end) + this.takeLast(end) }

"zhangsan@qq.com".isEmail() // true "13812345678".maskMiddle(3, 4) // "138****5678"

// 2. 为集合添加扩展 fun <T> List<T>.secondOrNull(): T? { return if (this.size >= 2) this[1] else null }

listOf(1, 2, 3).secondOrNull() // 2 listOf(1).secondOrNull() // null

// 3. 为数字添加单位转换 fun Int.dp2px(density: Float): Int { return (this * density + 0.5f).toInt() }

val px = 16.dp2px(3.0f) // 将16dp转换为px

扩展属性

除了函数,你也可以定义扩展属性,但不能有初始化器(只能显式定义getter/setter):

// 扩展属性(只读)
val String.isPhoneNumber: Boolean
    get() = this.length == 11 && this.all { it.isDigit() } && this.startsWith("1")

"13812345678".isPhoneNumber // true "abc".isPhoneNumber // false

// 扩展属性(可读写) var StringBuilder.lastChar: Char get() = this[length - 1] set(value) { this.setCharAt(length - 1, value) }

val sb = StringBuilder("Kotlin?") sb.lastChar = '!' println(sb) // Kotlin!

泛型扩展与可空接收者

// 泛型扩展:适用于所有类型
fun <T> T.printIt(): T {
    println(this)
    return this  // 返回自身,支持链式调用
}

// 使用:可以在不中断调用链的情况下打印调试 val result = 100.printIt().plus(50).printIt() // 输出:100 150

// 可空接收者扩展:允许在null上调用 fun String?.orDefault(default: String): String { return this ?: default }

val name: String? = null println(name.orDefault("匿名用户")) // 匿名用户

// 这个模式避免了到处写 ?: 默认值

扩展函数 vs 成员函数对照

特性成员函数扩展函数
定义位置类内部类外部(任何文件)
访问私有成员可以不可以(只能访问public/internal)
继承/多态支持(virtual)不支持(静态解析)
修改源码需要不需要(对第三方类也能扩展)
适用场景核心类功能辅助工具、DSL、链式API

实战练习

  1. 为Int添加扩展属性isEven判断偶数、isOdd判断奇数
  2. 为List<T>添加扩展函数randomOrNull()安全随机取元素
  3. 为String添加toTitleCase()扩展将所有单词首字母大写
  4. 创建可空类型的扩展函数,简化null判断逻辑
  5. 使用扩展函数为Android的View添加设置可见性的便捷方法

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 92 篇
0 完成
🔥 0