Kotlin 的 also、let、run、apply、with 这几个标准函数都是 标准库里的作用域函数(Scope Functions) ,主要作用是简化对象的初始化、配置、链式调用,以及避免空指针判断。
我帮你用一句话总结 + 参数/返回值对比 + 使用场景 + 代码示例的方式整理一下。
1. 区别速查表
| 函数 | this 还是 it | 返回值 | 典型用途 |
|---|---|---|---|
| let | it(对象作为参数) | Lambda 结果 | 转换、空安全调用、限制作用域 |
| also | it(对象作为参数) | 原对象 | 做额外操作(调试、日志、赋值) |
| run | this(对象作为接收者) | Lambda 结果 | 对象配置 + 返回计算结果 |
| apply | this(对象作为接收者) | 原对象 | 对象配置(Builder 模式) |
| with | this(对象作为接收者,非扩展函数) | Lambda 结果 | 多个操作集中在同一对象 |
2. 用法详解
(1) let
- 对象作为参数(it)传入 lambda
- 返回 lambda 的结果
- 常用于:空安全调用(?.let)、对象转换
val nameLength = "Kotlin".let {
println("名字是 $it") // it = "Kotlin"
it.length
}
// nameLength = 6
val nullableStr: String? = "Hello"
nullableStr?.let {
println("非空时执行: $it")
}
(2) also
- 对象作为参数(it)传入 lambda
- 返回原对象本身
- 常用于:在链式调用中插入副作用操作(日志、调试、检查)
val list = mutableListOf("A", "B").also {
println("原始列表: $it")
it.add("C")
}.also {
println("修改后: $it")
}
// list = ["A", "B", "C"]
(3) run
- 对象作为接收者(this)执行 lambda
- 返回 lambda 的结果
- 常用于:对象的初始化计算结果(不返回对象本身)
val textLength = "Kotlin".run {
println("字符串大写: ${uppercase()}")
length // 返回长度
}
// textLength = 6
(4) apply
- 对象作为接收者(this)执行 lambda
- 返回原对象本身
- 常用于:初始化对象(Builder 模式)
val person = Person().apply {
name = "Tom"
age = 18
}
// person 已被配置好,并返回本身
(5) with
- 非扩展函数,第一个参数是对象,lambda 里 this 指向它
- 返回 lambda 的结果
- 常用于:对某个对象做多个操作,且不需要链式调用
val result = with(StringBuilder()) {
append("Hello, ")
append("World!")
toString() // 返回结果
}
3. 核心区别记忆法
- 返回原对象本身的:apply(this)、also(it)
- 返回 lambda 结果的:run(this)、let(it)、with(this)
- 参数是对象本身的:with
- 参数是 lambda 的接收者的:apply、run
- 参数是 lambda 的参数的:let、also
4. 实战示例:结合使用
val user = User().apply {
name = "Jack"
age = 20
}.also {
println("调试:$it")
}.run {
// 这里只关心结果,而不是对象本身
"$name - $age 岁"
}.let {
println("最终结果: $it")
}