扩展函数与高阶函数
使用扩展函数为现有类型添加行为,并使用高阶函数和作用域函数(let、apply、also、run、with)编写表达力强的 Kotlin 代码。
扩展函数与高阶函数 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
扩展函数
扩展函数可以在不修改现有类且不使用继承的情况下,为其添加新函数。您可以扩展 String、Int、自定义类,甚至 Android 的 View。
语法:fun TypeName.functionName() { }
编写扩展函数
在扩展函数内部,this 指代接收者对象:
fun String.isPalindrome(): Boolean {
val cleaned = this.lowercase().filter { it.isLetter() }
return cleaned == cleaned.reversed()
}
fun Int.isEven() = this % 2 == 0
fun main() {
println("racecar".isPalindrome()) // true
println("hello".isPalindrome()) // false
println(4.isEven()) // true
println(7.isEven()) // false
}Android View 的扩展函数
一种常见的 Android 模式——使用扩展函数显示或隐藏视图,而不是重复编写样板代码:
import android.view.View
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// Usage in Activity:
// binding.progressBar.show()
// binding.recyclerView.hide()高阶函数
高阶函数以函数作为参数,或返回一个函数。您已经使用过它们:filter、map 和 forEach 都是高阶函数。
函数类型语法:(ParamType) -> ReturnType
将函数作为参数传递
定义一个接收另一个函数的函数:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun main() {
val sum = operate(3, 4) { x, y -> x + y }
val prod = operate(3, 4) { x, y -> x * y }
val max = operate(3, 4, ::maxOf) // method reference
println(sum) // 7
println(prod) // 12
println(max) // 4
}返回函数
函数也可以返回其他函数,这对于构建可配置的行为非常有用:
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
fun main() {
val double = makeMultiplier(2)
val triple = makeMultiplier(3)
println(double(5)) // 10
println(triple(5)) // 15
val numbers = listOf(1, 2, 3, 4)
println(numbers.map(double)) // [2, 4, 6, 8]
}作用域函数:let
Kotlin 作用域函数会对对象执行一个代码块并返回结果。let 用于空值检查和转换:
fun main() {
val name: String? = "Alice"
// Only runs if name is not null
name?.let {
println("Name length: ${it.length}")
println("Upper: ${it.uppercase()}")
}
// Transform a value
val length = name?.let { it.length } ?: 0
println("Length: $length") // 5
}作用域函数:apply 与 also
apply 用于配置对象,并返回该对象。also 执行副作用操作,并返回该对象:
data class Config(var host: String = "", var port: Int = 0, var timeout: Int = 0)
fun main() {
// apply: configure an object (this = receiver)
val config = Config().apply {
host = "api.example.com"
port = 443
timeout = 30
}
println(config) // Config(host=api.example.com, port=443, timeout=30)
// also: log or debug (it = receiver)
val result = listOf(1, 2, 3)
.also { println("Original: $it") }
.map { it * 2 }
.also { println("Doubled: $it") }
}作用域函数:run 与 with
run 会对对象执行一个代码块,并返回代码块的结果。with 与之类似,但它不是扩展函数:
data class User(val name: String, val age: Int)
fun main() {
val user = User("Bob", 30)
// run: compute something using the object
val greeting = user.run {
if (age >= 18) "Hello, $name!" else "Hi, $name!"
}
println(greeting) // Hello, Bob!
// with: group operations on an object
val info = with(user) {
"Name: $name, Age: $age"
}
println(info) // Name: Bob, Age: 30
}作用域函数速查表
选择合适作用域函数的快速参考:
let——空值安全的代码块,转换对象,返回 lambda 结果apply——配置对象,返回该对象(this)also——执行副作用操作(日志记录),返回该对象(it)run——根据对象计算结果,返回 lambda 结果with——对对象进行调用分组,不是扩展函数
内联函数与 reified
将高阶函数标记为 inline,可以避免在运行时分配 lambda 对象。reified 允许您在运行时使用泛型类型 T(通常泛型类型会被擦除):
inline fun <reified T> Any.isOfType(): Boolean = this is T
fun main() {
println("hello".isOfType<String>()) // true
println(42.isOfType<String>()) // false
println(3.14.isOfType<Double>()) // true
}快速检查
如果要配置新创建的对象并返回该对象本身,最适合使用哪个作用域函数?
回顾:扩展函数与高阶函数
现在您已经掌握了 Kotlin 的函数式工具集:
- 扩展函数——无需继承即可为任何类型添加行为
- 高阶函数——传递和返回函数,从而构建灵活的 API
- 作用域函数:
let(空值检查)、apply(配置)、also(副作用)、run/with(计算) inline+reified——零开销的 lambda,同时保留运行时类型信息
下一步:使用 Fragment 构建多屏应用。
常见问题解答
「扩展函数与高阶函数」课时是免费的吗?
是的 — 「扩展函数与高阶函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「扩展函数与高阶函数」这节课中我会学到什么?
使用扩展函数为现有类型添加行为,并使用高阶函数和作用域函数(let、apply、also、run、with)编写表达力强的 Kotlin 代码。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「扩展函数与高阶函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。