Kotlin 标准库函数 run 、apply 、 let 、 also 、 with 简单对比对比。
主要是太容易忘记了,因此记录于此。
正文
下面依次介绍怎么使用
let
inline fun <T, R> T.let(block: (T) -> R): R特点
对象作为参数传入:
it非常适合 空安全处理
典型用法:空安全 + 映射
val list: List<Int>? = arrayListOf(1, 2, 3) list?.let { println(it.size) it.map { value -> value * 2 } }
适用场景
object?.let { }判空数据转换 / 映射
限制变量作用域
run
inline fun <T, R> T.run(block: T.() -> R): R特点
this访问对象(可省略)返回 Lambda 结果
=
with+let的结合体
示例
val result = "biumall.com".run { println(isEmpty()) length } println(result) // 8
适用场景
对对象进行计算
需要返回值
想避免
it,又想判空
val name = user?.run { "$firstName $lastName" }with
inline fun <T, R> with(receiver: T, block: T.() -> R): R特点
不是扩展函数
对象作为参数传入
this访问对象返回 Lambda 结果
示例
val student = Student("大神", 20) val result = with(student) { println(name) println(age) 91 }
适用场景
对同一个对象多次访问属性/方法
Android 中
RecyclerView.onBindViewHolder很常见
缺点:不支持空安全调用(
?.with {}不存在)
apply
inline fun <T> T.apply(block: T.() -> Unit): T特点
this访问对象始终返回对象本身
非常适合「配置对象」
示例
val list = ArrayList<Int>().apply { add(1) add(2) add(3) }
典型场景
对象初始化
Builder 模式简化
View / Model 配置
val textView = TextView(context).apply { text = "Hello" textSize = 16f setTextColor(Color.BLACK) }
also
inline fun <T> T.also(block: (T) -> Unit): T特点
使用
it指代对象返回对象本身
不影响主流程,只“顺手做事”
示例
val name = "biumall.com".also { println("长度:${it.length}") }
典型场景
日志 / 埋点
调试
链式调用中插入副作用
val user = getUser() .also { logUser(it) } .apply { saveToDb(this) }
小结
| 场景 | 推荐 |
|---|---|
| 对象初始化 / 配置,最后返回对象本身 | apply |
| 链式调用中插一段「顺便做点事」,返回原对象 | also |
| 对对象做变换,返回计算结果 | run |
非空对象才执行逻辑,且用 it 指代 | let |
| 对一个对象连续调用多个方法/属性,不关心返回值 | with |
一句话记忆版:
**想改对象用
apply,想顺手做事用also,想算结果用run,想判空处理用let,想少写对象名用with。
| 函数 | 是否为扩展函数 | 对象引用 | 返回值 | 典型用途 |
|---|---|---|---|---|
let | 是 | it | Lambda 结果 | 判空、映射、链式转换 |
run | 是 | this | Lambda 结果 | 对象计算、结果返回 |
with | 否 | this | Lambda 结果 | 对同一对象多次操作 |
apply | 是 | this | 对象本身 | 对象初始化、配置 |
also | 是 | it | 对象本身 | 链式调用、日志、埋点 |
参考文章
《》
AI

