在 Kotlin 中,run
、also
、let
、apply
、with
是常用的作用域函数,它们可以简化代码并提供更优雅的操作方式。这些函数的主要区别在于返回值 和上下文对象的引用方式 (this
还是 it
)。
1. let
-
上下文对象引用 :使用
it
关键字 -
返回值:lambda 表达式的最后一行结果
-
适用场景 :对非空对象进行操作、转换对象、避免重复使用安全调用运算符(
?.
)
kotlin
kotlin
val str: String? = "Hello"
val length = str?.let {
println("字符串是:$it") // it 指代 str 的非空值
it.length // 返回长度
}
println("长度:$length") // 输出:长度:5
2. run
-
上下文对象引用 :使用
this
关键字(可省略) -
返回值:lambda 表达式的最后一行结果
-
适用场景:需要同时访问对象的多个属性 / 方法,并且需要返回结果
kotlin
kotlin
val person = Person("Alice", 25)
val info = person.run {
println("姓名:$name") // this 可省略,直接访问属性
println("年龄:$age")
"姓名:$name,年龄:$age" // 返回拼接的字符串
}
println(info) // 输出:姓名:Alice,年龄:25
3. apply
-
上下文对象引用 :使用
this
关键字(可省略) -
返回值:上下文对象本身
-
适用场景:对象初始化、配置对象属性(常用于构建者模式)
kotlin
scss
val list = mutableListOf<Int>().apply {
add(1)
add(2)
add(3) // 配置列表
}
println(list) // 输出:[1, 2, 3](返回列表本身)
4. also
-
上下文对象引用 :使用
it
关键字 -
返回值:上下文对象本身
-
适用场景:附加操作(如日志打印、调试),不改变对象但需要使用对象
kotlin
scss
val numbers = listOf(1, 2, 3)
val result = numbers.also {
println("原始列表:$it") // 打印日志(附加操作)
}.map { it * 2 } // 继续操作
println(result) // 输出:[2, 4, 6]
5. with
-
上下文对象引用 :作为参数传入,使用
this
关键字(可省略) -
返回值:lambda 表达式的最后一行结果
-
适用场景 :与
run
类似,但with
是独立函数,不是扩展函数
kotlin
kotlin
val book = Book("Kotlin 入门", "张三")
val bookInfo = with(book) {
"书名:$title,作者:$author" // this 可省略
}
println(bookInfo) // 输出:书名:Kotlin 入门,作者:张三
总结对比表
函数 | 上下文引用 | 返回值 | 典型用途 |
---|---|---|---|
let | it | lambda 结果 | 非空操作、对象转换 |
run | this | lambda 结果 | 访问多个属性并返回结果 |
apply | this | 上下文对象本身 | 对象初始化、属性配置 |
also | it | 上下文对象本身 | 附加操作(日志、调试) |
with | this | lambda 结果 | 访问对象属性(非扩展函数) |
选择合适的函数可以使代码更简洁、可读性更高,根据具体场景和需求来决定使用哪一个即可。