Kotlin常用作用域函数(let、run、apply、also、takeIf、with)

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.also(block: (T) -> Unit): T
        // public inline fun  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"
        }

你可能感兴趣的:(Kotlin常用作用域函数(let、run、apply、also、takeIf、with))