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()}")
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容