[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")
    }
}
相关推荐
愚公搬代码20 分钟前
【愚公系列】《Web应用安全》001-VMware的安装
前端·安全
xiaohaiAIgeo20 分钟前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
立少→万能汉编23 分钟前
用“立少→超文本”写静态网页,标签<倍>
服务器·前端·javascript
weixin_4316004431 分钟前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
你挚爱的强哥1 小时前
【chromeDownload】自定义组件:多用于登录框底部提供下载Chrome谷歌浏览器的链接
前端·vue.js·chrome
cindershade1 小时前
用原生 HTML5 视频与 Canvas 实现浏览器端视频抽帧封面
前端
笨鸟先飞,勤能补拙1 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
NutShell Wang2 小时前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
cindershade2 小时前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端
kisbad2 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript