0Pricing
Kotlin Academy · 课时

inline 函数:消除 Lambda 开销

将函数标记为 inline,避免为 Lambda 参数创建对象。

inline 函数:消除 Lambda 开销 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

什么是内联函数?

通常,传递给函数的匿名函数会被编译为一个匿名类。每次调用都会分配一个新对象,从而产生内存和时间开销。inline 关键字会告诉编译器,将函数体(以及其匿名函数参数)直接复制到调用点。

声明 inline

在 fun 前添加 inline 修饰符:

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

编译器如何重写调用

像 measureTime { doWork() } 这样的调用,在字节码层面会变成将 measureTime 的函数体直接粘贴到调用点,因此完全不会分配匿名函数对象。

何时使用 inline

在以下情况下使用 inline:

  • 函数接受一个或多个匿名函数参数
  • 函数在高频执行路径中被频繁调用(紧密循环、可组合函数)
  • 需要 reified 类型参数(下一节介绍)

性能基准示例

没有 inline 时,每次调用高阶函数都会分配一个匿名函数对象。使用它后,JVM 看到的是直线式代码——没有分配,也没有虚拟分派。

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

非局部返回

内联函数的一项重要优势是:匿名函数可以使用 return 退出外层函数,而不仅仅是退出匿名函数本身。这称为非局部返回。

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

inline 的限制

内联函数不能存储在变量中,也不能作为对象传递,因为它们在运行时并不存在为一等实体。如果 f 需要该签名的函数引用,就不能调用 f(::measureTime)。

内联集合处理流水线

标准库函数 map、filter、forEach 等都是 inline 函数。这就是为什么将它们串联起来不会为每个元素创建额外的闭包对象。

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

代码大小的权衡

每个调用点都会获得一份内联代码的副本。如果函数体很大且在许多位置调用,字节码大小就会增加。对于小型且频繁调用的匿名函数,优先使用 inline。

与伴生对象和顶层函数的交互

inline 可用于顶层函数和成员函数,但不能用于属性或构造函数。函数必须在调用点可见(通常为 public 或 internal)。

标准库示例

您已经了解的以下函数都是 inline:let、run、apply、also、with、use、synchronized、lazy(代码块变体)。inline 修饰符使它们的匿名函数实现零开销。

快速检查

将高阶函数标记为 inline 的主要好处是什么?

回顾:inline 函数

关键要点:

  • inline 会消除匿名函数对象的分配
  • 允许从匿名函数执行非局部返回
  • reified 类型参数必须使用它
  • 最适合小型且频繁调用的高阶函数
  • 标准库的作用域函数全部都是 inline

常见问题解答

「inline 函数:消除 Lambda 开销」课时是免费的吗?

是的 — 「inline 函数:消除 Lambda 开销」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「inline 函数:消除 Lambda 开销」这节课中我会学到什么?

将函数标记为 inline,避免为 Lambda 参数创建对象。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「inline 函数:消除 Lambda 开销」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. inline 函数:消除 Lambda 开销
  2. noinline 与 crossinline 修饰符
  3. reified 类型参数:在运行时访问 T
  4. 实用的 Reified 模式:解析、DI 与序列化
← 返回 Kotlin Academy