also、let、run、apply、with标准函数

66 阅读1分钟

Kotlin 的 also、let、run、apply、with 这几个标准函数都是 标准库里的作用域函数(Scope Functions) ,主要作用是简化对象的初始化、配置、链式调用,以及避免空指针判断。

我帮你用一句话总结 + 参数/返回值对比 + 使用场景 + 代码示例的方式整理一下。


1. 区别速查表

函数this 还是 it返回值典型用途
letit(对象作为参数)Lambda 结果转换、空安全调用、限制作用域
alsoit(对象作为参数)原对象做额外操作(调试、日志、赋值)
runthis(对象作为接收者)Lambda 结果对象配置 + 返回计算结果
applythis(对象作为接收者)原对象对象配置(Builder 模式)
withthis(对象作为接收者,非扩展函数)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")
}