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 反馈 — 无需本地设置。
此课程中的所有课时
- inline 函数:消除 Lambda 开销
- noinline 与 crossinline 修饰符
- reified 类型参数:在运行时访问 T
- 实用的 Reified 模式:解析、DI 与序列化