美文网首页Kotlin
10分钟吃透kotlin语法let apply also run

10分钟吃透kotlin语法let apply also run

作者: jalen2024 | 来源:发表于2022-02-28 20:15 被阅读0次

    结论先行

    区别 返回值 内部操作
    let 最后一行 it
    apply 调用者本身 this
    also 调用者本身 it
    run 最后一行 this或省略
    • 首先写一个Person类做演示,方便数据的展示。
    • 其次对每个api写1到2个测试的方法,
      看打印的log日志(注释上的即是)
    class Person(var name: String, var age: Int) {
        override fun toString(): String {
            return "[姓名:$name ~ 年龄:$age]"
        }
    }
    

    let

    • 适合对一些需要探空的数据做扩展处理,
    • 返回值是最后一行
    • 内部使用it代替
    
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次let数据kotlin.Unit
    fun test1(): Unit {
        val person = Person("张三", 20)
        val result = person.let {
            println("原始数据${it.toString()}")
            it.age = 30
            println("修改后数据${it.toString()}")
            it.age = 40
        }.let {
            println("二次let数据${it.toString()}")
        }
        return result
    }
    
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次let数据[姓名:张三 ~ 年龄:40]
    
    fun test01(): Person {
        val person = Person("张三", 20)
        val result = person.let {
            println("原始数据${it.toString()}")
            it.age = 30
            println("修改后数据${it.toString()}")
            it.age = 40
            it
        }.let {
            println("二次let数据${it.toString()}")
            it
        }
        return result
    }
    

    apply

    • 返回值就是调用者本身
    • 内部使用this代替
    
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次apply数据[姓名:张三 ~ 年龄:40]
    
    fun test2(): Person {
        val person = Person("张三", 20)
        val result = person.apply {
            println("原始数据${this.toString()}")
            this.age = 30
            println("修改后数据${this.toString()}")
            this.age = 40
        }.apply {
            println("二次apply数据${this.toString()}")
        }
        return result
    }
    

    also

    • 返回值就是调用者本身
    • 内部使用it代替
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次also数据[姓名:张三 ~ 年龄:40]
    
    fun test3(): Person {
        val person = Person("张三", 20)
        val result = person.also {
            println("原始数据${it.toString()}")
            it.age = 30
            println("修改后数据${it.toString()}")
            it.age = 40
        }.also {
            println("二次also数据${it.toString()}")
        }
        return result
    }
    

    run

    • 返回值就是 最后一行
    • 内部使用this代替
    • 可以给调用者直接赋值 省去变量名
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次also数据kotlin.Unit
    
    fun test4(): Unit {
        val person = Person("张三", 20)
        val result = person.run {
            println("原始数据${toString()}")
            age = 30
            println("修改后数据${toString()}")
            age = 40
        }.run {
            println("二次also数据${toString()}")
        }
        return result
    }
    
    
    //原始数据[姓名:张三 ~ 年龄:20]
    //修改后数据[姓名:张三 ~ 年龄:30]
    //二次also数据[姓名:张三 ~ 年龄:40]
    fun test04(): Person {
        val person = Person("张三", 20)
        val result = person.run {
            println("原始数据${toString()}")
            age = 30
            println("修改后数据${toString()}")
            age = 40
            this
        }.run {
            println("二次also数据${toString()}")
            this
        }
        return result
    }
    

    takeIf

    takeIf 判断条件成立 则执行

    //年龄大于19岁:[姓名:张三 ~ 年龄:20]
    //takeIf最后一行返回:[姓名:张三 ~ 年龄:40]
    fun test5() {
        val person = Person("张三", 20)
        person.takeIf { it.age > 19 }.let {
            println("年龄大于19岁:${it.toString()}")
            it!!.age = 40
            it
        }.let {
            println("takeIf最后一行返回:${it.toString()}")
        }
    

    takeUnless

    takeUnless 判断条件不成立 则执行

    //年龄 不是 大于21岁:[姓名:张三 ~ 年龄:20]
    //takeUnless最后一行返回:[姓名:张三 ~ 年龄:40]
    fun test05() {
        val person = Person("张三", 20)
        person.takeUnless { it.age > 21 }.let {
            println("年龄 不是 大于21岁:${it.toString()}")
            it!!.age = 40
            it
        }.let {
            println("takeUnless最后一行返回:${it.toString()}")
        }
    }
    

    相关文章

      网友评论

        本文标题:10分钟吃透kotlin语法let apply also run

        本文链接:https://www.haomeiwen.com/subject/icqrrrtx.html