val user = User("11", "1111", PlayerViewType.BLUE)
let、run
//let与run都会返回闭包的执行结果,区别在于let有闭包参数,而run没有闭包参数
val letResult = user.let { userLet: User -> "let::${userLet.javaClass}" }
println(letResult) //打印出let::包名
//let中的闭包参数user只有一个时可以省略不写(谁调用的let,闭包参数就是谁),然后用it来替代它
val letResult2 = user.let { "let2::${it.javaClass}" }
println(letResult2)
//run没有闭包参数,需要通过this来指代外层调用它的对象,这是和let唯一的区别
val runResult = user.run { "run::${this.javaClass}" }
println(runResult)
also、apply
//also与apply都不返回闭包的执行结果,区别在于also有闭包参数,而apply没有
user.also {
println("also::${it.javaClass}") //打印出also::包名
}
user.apply {
println("apply::${this.javaClass}")
}
// public inline fun <T> T.also(block: (T) -> Unit): T
// public inline fun <T> T.apply(block: T.() -> Unit): T
// 因为返回的是个T,所以可以一直链式调用下去,所以also和apply应用于链式调用情况
user.also {
println("also::${it.javaClass}")
}.apply {
println("apply::${this.javaClass}")
}.name = "2222"
take、takeUnless
//takeIf的闭包返回一个判断结果,为false时,takeIf函数会返回空
//takeUnless与takeIf正好相反,闭包的判断结果为true时,函数会返回空
user.takeIf {
it.id.length > 0
}?.also {
println("id为${it.id}")
} ?: println("id为空")
user.takeUnless {
it.id.length > 0
}?.also {
println("id为空")
} ?: println("id为${user.id}")
with
//with比较特殊,不是以扩展方法的形式存在的,而是一个顶级函数
//等价于user.apply{this.name = "with"}的效果
//应用场景:比如安卓中可以传入不同的view,进行同样的操作
with(user){
this.name = "with"
}
网友评论