作用域操作符使用与操作所有的对象
其中包括?:
let与run都会返回闭包的执行结果,区别在于let有闭包参数,而run没有闭包参数
let {...}??返回闭包的执行结果,有具体参数,或者用it访问
run {...} 返回闭包的执行结果,使用this访问或者可以省略this(调用方比较简单可以采用)
also与apply都不返回闭包的执行结果,区别在于also有闭包参数,而apply没有闭包参数
also {...}?不返回闭包的执行结果,返回调用方本身,有具体参数,或者用it访问
apply {...}?不返回闭包的执行结果,返回调用方本身,使用this访问或者可以省略this(调用方比较简单可以采用)
with(T) {...}? 返回闭包的执行结果,使用this访问或者可以省略this
关于要使用it访问方便还是this或者省略this方便可以参考作用域函数 - Kotlin 语言中文站
代码实现:
/**
* 作用域函数
* run {...}
* with(T) {...}
* let {...}
* apply {...}
* also {...}
*/
fun main() {
val user = User("chenqz")
//let与run都会返回闭包的执行结果,区别在于let有闭包参数,而run没有闭包参数
val letResult: String = user.let { user -> "let::${user.javaClass}" }
println(letResult)
//只有一个参数使用it替代
val let2Result: String = user.let { "let2::${it.javaClass}" }
println(let2Result)
val runResult: String = user.run { "run::${this.javaClass}" }
println(runResult)
//also与apply都不返回闭包的执行结果,区别在于also有闭包参数,而apply没有闭包参数
user.also {
println("also::${it.javaClass}")
}.apply {
println("apply::${this.javaClass}")
}.name = "hello"
val nameX = with(user) {
name = "x"
return@with name
}
println("nameX:" + nameX)
//takeIf的闭包会返回一个判断结果,为false时,takeIf函数会返回空
//takeUnless与takeIf刚好相反,闭包的判断结果,为true时,函数会返回空
//?:相当于else
user.takeIf { it.name.length > 0 }?.also { println("姓名为${it.name}") } ?: println("姓名为空")
user.takeUnless { it.name.length > 0 }?.also { println("姓名为空") } ?: println("姓名为${user.name}")
}
data class User(var name: String)
|