Kotlin run函数
外观
Kotlin run函数是标准库中的作用域函数之一,用于在对象上下文中执行代码块并返回结果。它结合了对象访问与表达式计算的特性,适用于初始化、转换或链式调用场景。
语法与基本用法[编辑 | 编辑源代码]
run函数有两种形式: 1. 扩展函数形式:在对象上调用,代码块内通过`this`访问该对象。 2. 非扩展函数形式:独立调用,用于创建临时作用域。
扩展函数形式[编辑 | 编辑源代码]
val result = object.run {
// 访问object的属性和方法
this.property
// 最后一行作为返回值
computedValue
}
示例:
data class User(val name: String, var age: Int)
fun main() {
val user = User("Alice", 25)
val bio = user.run {
age += 1 // 修改user的属性
"Name: $name, Age: $age" // 返回字符串
}
println(bio) // 输出: Name: Alice, Age: 26
}
非扩展函数形式[编辑 | 编辑源代码]
val result = run {
// 独立作用域
val x = 10
x * 2 // 返回值
}
与其它作用域函数的对比[编辑 | 编辑源代码]
函数 | 接收者访问 | 返回值 | 典型用例 |
---|---|---|---|
`run` | `this` | 代码块结果 | 对象初始化+计算 |
`let` | `it` | 代码块结果 | 空检查后操作 |
`with` | `this` | 代码块结果 | 无安全调用时分组操作 |
`apply` | `this` | 对象本身 | 对象配置 |
`also` | `it` | 对象本身 | 附加效果 |
实际应用场景[编辑 | 编辑源代码]
场景1:链式调用中的转换[编辑 | 编辑源代码]
val formattedDate = Calendar.getInstance().run {
set(2023, Calendar.JANUARY, 1)
time.toString() // 返回格式化后的日期字符串
}
场景2:安全初始化复杂对象[编辑 | 编辑源代码]
val dialog = AlertDialog.Builder(context).run {
setTitle("Warning")
setMessage("Do you want to proceed?")
create() // 返回构建完成的Dialog对象
}
场景3:临时作用域变量隔离[编辑 | 编辑源代码]
fun calculateDiscount(price: Double) = run {
val discountRate = if (price > 100) 0.2 else 0.1
price * (1 - discountRate)
}
性能考虑[编辑 | 编辑源代码]
- run函数会生成临时对象,但在JVM上通常会被内联优化(标记为`inline`)。
- 避免在循环中嵌套多层`run`,可能影响可读性。
高级用法:结合Elvis操作符[编辑 | 编辑源代码]
val userInput: String? = getUserInput()
val processed = userInput?.run {
trim().uppercase()
} ?: run {
// 当userInput为null时执行
"DEFAULT"
}
可视化流程[编辑 | 编辑源代码]
数学表达(可选)[编辑 | 编辑源代码]
对于对象`obj`和代码块`f`,run函数的行为可表示为:
总结[编辑 | 编辑源代码]
- `run`适用于需要同时访问对象上下文并返回计算结果的场景。
- 扩展形式常用于对象配置,非扩展形式适合隔离变量作用域。
- 通过返回代码块最后一行实现简洁的函数式风格。