Kotlin 作用域函数详解:apply、let等五大函数对比
Kotlin 提供了多个作用域函数(Scope Functions),它们都是在对象的上下文中执行代码块的扩展函数。最常用的五个是:let、run、with、apply和 also。它们的主要区别在于:
- 1.
引用对象的方式(
this或it) - 2.
返回值类型(返回上下文对象本身或返回 lambda 结果)
下面是详细对比和使用场景:
📊 五大作用域函数对比表
|
函数 |
上下文对象引用 |
返回值 |
是否扩展函数 |
典型使用场景 |
|---|---|---|---|---|
|
let |
|
lambda 结果 |
是 |
非空检查、转换对象 |
|
run |
|
lambda 结果 |
是 |
对象配置并计算结果 |
|
with |
|
lambda 结果 |
否 |
对已有对象进行分组操作 |
|
apply |
|
对象本身 |
是 |
对象初始化配置 |
|
also |
|
对象本身 |
是 |
执行附加操作(日志、验证等) |
🧩 详细解析与代码示例
1. let函数
- •
引用对象:
it - •
返回值:lambda 的最后一行
- •
主要用途:安全调用非空对象、对象转换
kotlin
复制
// 示例1: 安全调用
val name: String? = "Kotlin"
val length = name?.let {
println("Name is $it")
it.length // 返回值
} ?: 0 // 如果为null则返回0
// 示例2: 链式转换
val numbers = listOf(1, 2, 3)
val doubled = numbers.map { it * 2 }
.let {
println("Doubled: $it")
it.filter { num -> num > 3 } // 返回值
}
2. run函数
- •
引用对象:
this(可省略) - •
返回值:lambda 的最后一行
- •
主要用途:对象配置并计算结果
kotlin
复制
val rectangle = Rectangle().run {
width = 100
height = 50
calculateArea() // 返回值
}
println("Area: $rectangle") // 输出面积
3. with函数
- •
引用对象:
this(可省略) - •
返回值:lambda 的最后一行
- •
主要用途:对已有对象进行分组操作(非扩展函数)
kotlin
复制
val builder = StringBuilder()
val result = with(builder) {
append("Hello")
append(" Kotlin")
toString() // 返回值
}
4. apply函数
- •
引用对象:
this(可省略) - •
返回值:对象本身
- •
主要用途:对象初始化配置
kotlin
复制
// 创建并配置Intent
val intent = Intent().apply {
action = "com.example.ACTION"
putExtra("key", "value")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
// intent 已配置好,可以直接使用
5. also函数
- •
引用对象:
it - •
返回值:对象本身
- •
主要用途:执行附加操作(日志、验证等)
kotlin
复制
val user = User().also {
println("User created: $it")
validateUser(it) // 执行验证但不影响返回值
}.apply {
name = "Alice"
age = 30
}
700

被折叠的 条评论
为什么被折叠?



