kotlinの文法の違いを理解する let applyも実行する takeIf takeUnless 10分で

結論が先

違い 戻り値 内部操作
させて 最後の行 それ
申し込み 呼び出し元自体 これ
また 呼び出し元自体 それ
走る 最後の行 これまたは省略
  • 最初に、データ表示を容易にするデモ用の Person クラスを作成します。
  • 次に、API ごとに 1 ~ 2 個のテスト メソッドを記述し、
    出力されたログ (メモにあるもの) を確認します。
class Person(var name: String, var age: Int) {
    override fun toString(): String {
        return "[姓名:$name ~ 年龄:$age]"
    }
}

させて

  • サウンディングが必要な一部のデータの拡張処理に適しています。
  • 戻り値は最後の行です
  • 代わりに内部的に使用します

//原始数据[姓名:张三 ~ 年龄: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
}

申し込み

  • 戻り値は呼び出し元そのもの
  • 代わりにこれを内部的に使用します

//原始数据[姓名:张三 ~ 年龄: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
}

また

  • 戻り値は呼び出し元そのもの
  • 代わりに内部的に使用します
//原始数据[姓名:张三 ~ 年龄: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
}

走る

  • 戻り値は最終行
  • 代わりにこれを内部的に使用します
  • 変数名なしで呼び出し元に直接割り当てることができます
//原始数据[姓名:张三 ~ 年龄: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 判定条件が真でない場合に実行

//年龄 不是 大于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()}")
    }
}

おすすめ

転載: blog.csdn.net/admin_jalen/article/details/123190946