apply, let, with, run, also的区别是什么
Kotlin 提供的五个作用域函数(apply、let、with、run 和 also)可以帮助简化代码,但它们之间的区别可能会让人感到困惑。接下来,我将详细解释这些函数的区别,以及第 13 点提到的解构声明。
1. apply
apply 的作用是对一个对象进行配置,它会返回调用该函数的对象本身。一般用于在创建对象时需要对其进行多次配置的场景。
- 返回值: 对象自身。
this引用: 在apply块中,this代表调用者对象。- 常见场景: 对对象进行初始化或修改。
kotlin
复制代码
val person = Person().apply { name = "John" age = 30 }
2. let
let 主要用于对对象进行某种转换或执行某些操作,通常与空安全调用结合使用。
- 返回值: Lambda 表达式的结果。
it引用: 在let块中,it代表调用者对象。- 常见场景: 空安全检查、链式调用。
kotlin
复制代码
val nameLength = person.name?.let { it.length }
3. with
with 并不是一个扩展函数,而是一个常规函数。它通常用于调用多个对象的方法或属性。with 的主要好处是在处理一个对象时,减少重复引用。
- 返回值: Lambda 表达式的结果。
this引用: 在with块中,this代表传入的对象。- 常见场景: 处理非可空对象的多个属性或方法。
kotlin
复制代码
val result = with(person) { println(name) println(age) name + age }
4. run
run 既可以作为扩展函数也可以作为顶层函数,常用于执行一个代码块,并且返回其最后一行的值。
- 返回值: Lambda 表达式的结果。
this引用: 在run块中,this代表调用者对象。- 常见场景: 当需要对对象执行某些操作并返回结果时,或者用于执行不返回对象本身的代码块。
kotlin
复制代码
val personName = person.run { println(name) name }
5. also
also 类似于 let,但区别在于它返回调用对象本身,而不是 Lambda 表达式的结果。它的作用是进行额外的操作,通常用作调试或链式调用的一部分。
- 返回值: 对象自身。
it引用: 在also块中,it代表调用者对象。- 常见场景: 在链式调用中进行额外的操作,例如打印日志或调试。
kotlin
复制代码
val person = Person().also { it.name = "John" it.age = 30 println(it) }
作用域函数总结:
- 返回值:
- 返回自身:
apply,also - 返回 Lambda 结果:
let,run,with
- 返回自身:
- 引用对象:
this:apply,run,withit:let,also
更多推荐


所有评论(0)