1️⃣ let
- 特点:
it指代对象,返回 lambda 的结果。 - 适用场景:对象非空处理、链式调用、对结果进行操作。
- 例子:
val name: String? = "Kotlin"
val length = name?.let {
println(it)
it.length
}
- 返回值是 lambda 的最后一行,这里
length= 6
2️⃣ apply
- 特点:
this指代对象,返回 对象本身。 - 适用场景:对象初始化/配置。
- 例子:
val person = Person().apply {
name = "Alice"
age = 20
}
- 返回值是
person对象本身
3️⃣ run
- 特点:
this指代对象,返回 lambda 的结果。 - 适用场景:对象作用域操作并计算返回值。
- 例子:
val result = "Kotlin".run {
println(this)
length
}
- 返回值是 lambda 的最后一行,这里
result= 6
4️⃣ also
- 特点:
it指代对象,返回 对象本身。 - 适用场景:对对象做额外操作(如打印、日志),链式调用。
- 例子:
val person = Person().also {
println("Creating person: $it")
}
- 返回值是
person对象本身
5️⃣ with
- 特点:
this指代对象,返回 lambda 的结果。它不是扩展函数。 - 适用场景:对某对象多次操作时使用。
- 例子:
val person = Person("Bob", 25)
val info = with(person) {
println(name)
age
}
- 返回值是 lambda 的最后一行,这里
info= 25
🔹 对比表
| 函数 | this/it | 返回值 | 用途 |
|---|---|---|---|
| let | it | lambda 结果 | 对非空对象操作/链式调用 |
| apply | this | 对象本身 | 初始化/配置对象 |
| run | this | lambda 结果 | 对象操作 + 返回结果 |
| also | it | 对象本身 | 链式操作、额外操作(日志等) |
| with | this | lambda 结果 | 对象操作,非扩展函数 |
核心思路
-
返回值不同
- 返回对象本身 →
apply、also - 返回 lambda 结果 →
let、run、with
- 返回对象本身 →
-
引用方式不同
- 用
this→apply、run、with - 用
it→let、also
- 用
-
常用场景
- 初始化对象 →
apply - 链式处理、非空操作 →
let - 调试、打印、附加操作 →
also - 计算结果、对象内部操作 →
run、with
- 初始化对象 →
🔹一句话记忆
“想要结果就用 let/run/with,想要返回对象就用 apply/also;需要 it 就用 let/also,需要 this 就用 apply/run/with。