Kotlin 作用域函数let、run、also、apply、with、takeIf、takeUnless


Kotlin学习总结


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
        }

你可能感兴趣的:(kotlin)