Android Kotlin 之 let,apply,run,also,with

83 阅读2分钟

image.png

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返回值用途
letitlambda 结果对非空对象操作/链式调用
applythis对象本身初始化/配置对象
runthislambda 结果对象操作 + 返回结果
alsoit对象本身链式操作、额外操作(日志等)
withthislambda 结果对象操作,非扩展函数

核心思路

  1. 返回值不同

    • 返回对象本身 → applyalso
    • 返回 lambda 结果 → letrunwith
  2. 引用方式不同

    • thisapplyrunwith
    • itletalso
  3. 常用场景

    • 初始化对象apply
    • 链式处理、非空操作let
    • 调试、打印、附加操作also
    • 计算结果、对象内部操作runwith

🔹一句话记忆

“想要结果就用 let/run/with,想要返回对象就用 apply/also;需要 it 就用 let/also,需要 this 就用 apply/run/with。