在 Kotlin 中,作用域函数是一组用于在对象上下文中执行代码块的函数。 它们通过简洁的语法实现对对象的操作和逻辑封装。
作用域函数的对比:

1 let
特点:
- 通过
it
访问对象,需显式使用; - 返回值是代码块的最后一行结果;
- 核心场景:空安全检查和数据转换;
示例:
kotlin
val name: String? = "Kotlin"
val length = name?.let {
println("非空时执行:$it") // 输出:非空时执行:Kotlin
it.length
} ?: 0
println(length) // 输出:6
val result = listOf(1, 2, 3)
.map { it * 2 }
.let { it.joinToString("-") }
println(result) // 输出:2-4-6
2 run
特点:
- 通过
this
访问对象,可省略; - 返回代码块的最后一行结果;
- 核心场景:对象操作并返回结果,或替代
let
简化代码;
示例:
kotlin
data class User(var name: String, var age: Int)
val user = User("Eileen", 34)
val info = user.run {
age += 5
"姓名: $name, 年龄: $age"
}
println(info) // 姓名: Eileen, 年龄: 39
val nullableUser: User? = User("Bob", 30)
val message = nullableUser?.run {
"用户: $name"
} ?: "用户不存在"
println(message) // 用户: Bob
3 with
特点:
- 非扩展函数,直接传入对象:
with(obj) {...}
; - 通过
this
访问对象,可省略; - 返回值是代码块的最后一行结果;
- 核心场景:批量操作对象,无需重复写对象名;
示例:
kotlin
val numbers = mutableListOf(1, 2, 3)
val sum = with(numbers) {
add(4)
sum()
}
println(sum) // 10
4 apply
特点:
- 通过
this
访问对象,可省略; - 返回值是对象本身;
- 核心场景:对象初始化或链式配置属性;
示例:
kotlin
// Android 中初始化 TextView
val textView = TextView(this).apply {
text = "Hello"
textSize = 16f
setTextColor(Color.BLACK)
}
// 数据类配置
data class Config(var host: String = "", var port: Int = 0)
val config = Config().apply {
host = "127.0.0.1"
port = 8080
}
5 also
特点:
- 通过
it
访问对象,需显式使用; - 返回值是对象本身;
- 核心场景:附加操作(如日志、验证),不影响对象本身;
示例:
kotlin
val list = mutableListOf(1, 2, 3).also {
println("列表初始化完成 $it")
it.add(4) // 附加操作
}
println(list)
// 链式调用中插入日志
val file = File("data.txt")
.also { println("文件路径: ${it.path}") }
.readText()