Kotlin作用域函数(Scope Functions)
在 Kotlin 中,let、run、also、apply 和 with 是标准库中提供的几个非常有用的作用域函数(Scope Functions)。它们的主要作用是在对象的上下文中执行代码块,并且每个函数在返回值和使用方式上有所不同。
1. let
作用:在非空对象上执行代码块,并将对象作为参数传递到代码块中。
返回值:代码块的返回值。
-
典型使用场景:对非空对象进行操作,或者链式调用时避免空指针。
val result = obj?.let { // 在非空对象上执行操作 it.doSomething() it.name // 返回最后一个表达式的结果 }
2. run
作用:在对象上执行代码块,可以直接访问对象的属性和方法。
返回值:代码块的返回值。
典型使用场景:需要在对象上下文中执行一些操作并返回结果。
val result = obj.run {
// 直接访问对象的属性和方法
doSomething()
name // 返回最后一个表达式的结果
}
3. also
作用:在对象上执行代码块,并将对象作为参数传递到代码块中。
返回值:对象本身。
典型使用场景:需要在操作对象的同时返回对象本身(例如链式调用)。
val result = obj.also {
// 对对象执行一些操作
it.doSomething()
} // 返回 obj 本身
4. apply
作用:在对象上执行代码块,可以直接访问对象的属性和方法。
返回值:对象本身。
典型使用场景:初始化对象或配置对象的属性。
val result = obj.apply {
// 直接访问对象的属性和方法
name = "Kotlin"
age = 10
} // 返回 obj 本身
5. with
作用:在对象上执行代码块,可以直接访问对象的属性和方法。
返回值:代码块的返回值。
典型使用场景:对一个对象执行多个操作,而不需要链式调用。
val result = with(obj) {
// 直接访问对象的属性和方法
doSomething()
name // 返回最后一个表达式的结果
}
对比表格
函数 | 上下文对象 (this/it) | 上下文对象 (this/it) | 上下文对象 (this/it) |
---|---|---|---|
let | it | 代码块返回值 | 非空对象操作、链式调用 |
run | this | 代码块返回值 | 对象上下文操作并返回结果 |
also | it | 对象本身 | 操作对象并返回对象本身 |
apply | this | 对象本身 | 初始化或配置对象 |
with | this | 代码块返回值 | 对一个对象执行多个操作 |
6. takeIf 和 takeUnless
takeIf:如果条件为 true,则返回对象本身,否则返回 null。
takeUnless:如果条件为 false,则返回对象本身,否则返回 null。
val result = obj.takeIf { it.isValid() } // 如果 isValid() 为 true,返回 obj,否则返回 null
val result2 = obj.takeUnless { it.isInvalid() } // 如果 isInvalid() 为 false,返回 obj,否则返回 null
7. repeat
作用:重复执行某个操作指定的次数。
典型使用场景:需要重复执行某些操作。
repeat(5) {
println("Hello, Kotlin!")
}
8. use
作用:用于自动关闭资源(实现了 Closeable 接口的对象)。
典型使用场景:处理文件、网络连接等需要关闭的资源。
File("example.txt").bufferedReader().use { reader ->
println(reader.readText())
} // 自动关闭 reader
总结
let:适合非空对象操作,返回代码块结果。
run:适合对象上下文操作,返回代码块结果。
also:适合操作对象并返回对象本身。
apply:适合初始化或配置对象,返回对象本身。
with:适合对一个对象执行多个操作,返回代码块结果。