10分钟吃透kotlin语法let apply also run takeIf takeUnless的区别

结论先行

区别 返回值 内部操作
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 takeIf takeUnless的区别)