0Pricing
Android Academy · 课时

扩展函数与高阶函数

使用扩展函数为现有类型添加行为,并使用高阶函数和作用域函数(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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 空值安全
  2. 类与对象
  3. 数据类与密封类
  4. 扩展函数与高阶函数
← 返回 Android Academy