Kotlin run,apply,also, let,with区别
在 Kotlin 中,run
、with
、apply
、also
和 let
是标准库中的几个扩展函数,它们都用于对象的上下文中执行代码块,并具有不同的用途和返回值。下面是它们之间的主要区别:
run
:
- 作用:在对象上下文中执行一个代码块,并返回代码块的结果。
- 语法:object.run { }
- 返回值:Lambda 表达式的结果。
- 示例:
val result = "Kotlin".run {
this.length
}
println(result) // 输出 6
with
:
- 作用:在不需要返回值的情况下使用对象的上下文执行代码块,返回代码块的结果。
- 语法:with(object) { }
- 返回值:Lambda 表达式的结果。
- 示例:
val result = with("Kotlin") {
length
}
println(result) // 输出 6
apply
:
- 作用:在对象上下文中执行一个代码块,并返回该对象本身。
- 语法:object.apply { }
- 返回值:对象本身。
- 示例:
val result = StringBuilder().apply {
append("Kotlin")
append(" is awesome")
}
println(result.toString()) // 输出 "Kotlin is awesome"
also
:
- 作用:在对象上下文中执行一个代码块,并返回该对象本身。
- 语法:object.also { }
- 返回值:对象本身。
- 示例:
val result = "Kotlin".also {
println(it) // 输出 "Kotlin"
}
println(result) // 输出 "Kotlin"
let
:
- 作用:在对象上下文中执行一个代码块,并返回代码块的结果。通常用于处理可空对象。
- 语法:object?.let { }
- 返回值:Lambda 表达式的结果。
- 示例:
val name: String? = "Kotlin"
val result = name?.let {
it.length
}
println(result) // 输出 6
总结
run
和let
都返回代码块的结果,但run
是直接在对象上调用,而let
适用于可空对象。with
不是扩展函数,作用类似于run
,但需要传入对象作为参数。apply
和also
都返回对象本身,但apply
提供了this
作为上下文对象,also
提供了it
作为上下文对象。
根据需求选择合适的函数可以使代码更简洁、更易读。