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
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值