Kotlin中内置的用于数据变换的函数,与集合的操作符相似,但是它可以用于所有对象。
首先定义一个data数据类型,java中的bean对象
data class User(var id: Int, var name: String)
let和run
fun test1() {
val user = User(1001, "zhangyu")
//let与run
//都会返回闭包的执行结果
//区别在于let有闭包参数,run没有闭包参数
val letResult = user.let { user: User -> "let::${user.javaClass}" }
println(letResult)//let::class com.zhangyu.testKotlin.User
//只有一个参数可以省略,用it代替
val letResult2 = user.let { "let::${it.javaClass}" }
println(letResult2)//let::class com.zhangyu.testKotlin.User
//无参数,可以用user或者this
val runResult = user.run { "run::${this.javaClass}" }
println(runResult)//run::class com.zhangyu.testKotlin.User
}
also、apply和with
fun test2() {
val user = User(1001, "zhangyu")
//also与apply
//都不返回闭包参数
//返回当前对象本身,这样就可以连续调用
//区别在于also有闭包参数,而apply没有闭包参数
user
.also {
println("${it.id}") //1001
}
.apply {
println(this.name) //zhangyu
}
.name = "liming"
.also {
println(it) //liming
}
.also {
println(user.name) //此时的user.name还是zhangyu
}
println(user.name) //limingwi
//with不是扩展方法,是一个顶级函数
//with和apply,以下两种写法是相等的效果
with(user) {
this.name = "with"
}
user.apply {
this.name = "apply"
}
}
takeIf和takeUnless
fun test3() {
val user = User(1001, "zhangyu")
//takeIf和takeUnless
//takeIf的闭包返回一个判断结果,为false时,takeIf函数会返回空
//if a or b
val user1 = user
.takeIf {
it.id > 0 //true返回user(然后继续执行),false返回空
}
?.also {
println(it.name) //true执行
}
?: println("空")//false执行
println(user1) //User(id=1001, name=zhangyu)
//if a or b
val user2 = user
.takeIf {
it.id < 0 true返回user(然后继续执行),false返回空
}
?.also {
println(it.name) //true执行
}
?: println("空") //false执行
println(user2)//kotlin.Unit
//if b or a
user
.takeUnless {
it.id < 0
}
?.also {
println("空") //执行false
}
?: println(user.name) //执行true
}
一些经典用法
- 创建一个paint使用apply可以直接在作用域直接直接赋值该对象的属性,不需要使用paint.color来赋值了
var paint = Paint()
.apply {
color = 0x000000
textSize = 30F
isAntiAlias = true
}