作用域函数
let/run/with/apply/also 五种作用域函数对比与选择
作用域函数
let/run/with/apply/also 五种作用域函数——选对能让代码更 Kotlin 风。
学完本章你将: 掌握五种的对比和选择指南。
五种一览
kotlin
data class Person(var name: String, var age: Int)
val p = Person("小明", 25)
// let:it 参数,返回 lambda 结果
p.let { println(it); it.name } // → "小明"
// run:this 接收者,返回 lambda 结果
p.run { println(name); age } // → 25
// with:非扩展,this 接收者
with(p) { println("$name, $age") } // → Unit
// apply:this 接收者,返回 this 自身
p.apply { age = 26 } // → p(age已改为26)
// also:it 参数,返回 this 自身
p.also { println("处理: ${it.name}") } // → p
选择指南
kotlin
// 对非空对象执行操作 → let
name?.let { println(it.length) }
// 初始化对象 → apply
val user = User().apply {
name = "小明"
age = 25
}
// 对象配置并计算结果 → run
val result = service.run {
connect()
fetchData()
}
// 需要对象本身但执行副作用 → also
list.also { println("共 ${it.size} 条") }
.map { it * 2 }
速查表
| 函数 | 接收者 | 返回值 | 场景 |
|---|---|---|---|
| let | it | lambda结果 | 空安全/转换 |
| run | this | lambda结果 | 配置+计算 |
| with | this | lambda结果 | 多方法调用 |
| apply | this | this | 初始化 |
| also | it | this | 副作用/日志 |