[kotlin] inline 函数

inline

inline函数是什么?

  • nline 函数,就是在编译时会把函数体和传入的 lambda 代码"展开"到调用处,而不是像普通函数一样生成函数调用。
    这样做的最大特点是:消除了高阶函数调用的性能损耗

inline函数解决了什么问题?

问题:高阶函数的性能损耗

  • 每次传 lambda,JVM 都会创建一个对象(匿名类),并有额外的函数调用开销。如果高阶函数用得多,性能损耗就明显了。
kotlin 复制代码
fun doSomething(action: () -> Unit) { action() }

解决方案:inline函数

  • Kotlin 的 inline 关键字告诉编译器:
    把函数体和传入的 lambda 代码直接展开到调用处,不用生成额外对象和函数调用。 这样 lambda 不再生成对象,也没有函数调用栈,性能几乎和普通代码一样高效。
kotlin 复制代码
inline fun doSomething(action: () -> Unit) { action() }

典型应用场景

  • 集合操作 (如 forEachmapfilter 等)都用 inline,提高性能。
  • DSL 设计:比如 Kotlin 的协程、Anko、Jetpack Compose 等,广泛用 inline 实现语法糖。

缺点

  • 代码膨胀(Code Bloat) :每次调用 inline 函数,都会把代码"展开",如果调用很多次,最终编译出的字节码会变大,影响 APK/程序体积。
  • 调试困难:因为函数被展开,调试时栈信息变得不直观。
  • 不能用递归:inline 函数不能递归调用自己,否则展开会无限循环。
  • 某些场景不能 inline :比如 lambda 被跨作用域保存(这时需要用 noinlinecrossinline 修饰)。

crossinline

crossinline

Kotlin 中用于 lambda 参数声明 的一个修饰符,主要用于 inline 函数

它的作用是:禁止在传入的 lambda 表达式中使用 non-local return ,即不能在 lambda 里直接用 return 跳出外层函数。

  • 场景 代码
kotlin 复制代码
inline fun foo(action: () -> Unit) {
    action() // 如果 action() 里 return,会直接退出 foo
}
fun test() {
    foo {
        return // 非本地 return,直接退出 test()
    }
}

crossinline 的作用

有些情况下,这种"非本地 return"是不安全或不允许的,比如你要把 lambda 存起来、用在另一个线程、或者作为参数传递。

这时就需要用 crossinline 修饰 lambda 参数,强制只允许局部 return(即只能退出 lambda 本身,不能跳出外层函数)。

kotlin 复制代码
inline fun doSomething(crossinline action: () -> Unit) {
    val runnable = Runnable { action() }
    runnable.run()
}
fun test() {
    doSomething {
        // return // 编译错误!不能在 crossinline lambda 里用非本地 return
        println("hello")
    }
}
相关推荐
前端大卫10 分钟前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘25 分钟前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare26 分钟前
浅浅看一下设计模式
前端
Lee川30 分钟前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix1 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人1 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl1 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人1 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼1 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端