美文网首页Kotlin系列
Kotlin标准函数:takeIf、takeUnless(译文)

Kotlin标准函数:takeIf、takeUnless(译文)

作者: 金大王 | 来源:发表于2021-11-10 16:01 被阅读0次

    takeIf、takeUnless都是Kotlin的扩展功能。先简单了解Kotlin中的扩展功能和Lambda函数。

    翻译原文:difference between kotlin also, apply, let, use, takeIf and takeUnless in Kotlin

    看完此篇更易理解:Kotlin标准函数:let、with、run、apply和also

    扩展功能:

    通过使用扩展函数,可以在不继承类的情况下为类创建函数。
    示例:

    //要查找String中是否只有数字,可以创建如下所示的方法而无需继承String类
    fun String.isNumber(): Boolean = this.matches("[0-9]+".toRegex())
    
    //可以这样使用上面的扩展功能
    val phoneNumber = "138888888888"
    println(phoneNumber.isNumber)               //打印 true
    

    Lambda函数

    Lambda函数就像Java中的Interface一样.但是在Kotlin中,可以将Lambda函数作为参数传递给函数。
    示例:

    //block是Lambda函数,它作为参数传递
    fun String.isNumber(block: () -> Unit): Boolean {
        return if (this.matches("[0-9]+".toRegex())) {
            block()
            true
        } else false
    }
    
    //可以这样使用
    val phoneNumber = "138888888888"
    println(phoneNumber.isNumber {
        println("Block executed")
    })
    //打印:
    Block executed
    true
    

    let函数

    源码:

    public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
    

    使用了T和R两种类型

    T.let
    

    T可以是任何类似于String类的对象,因此可以对任何对象调用此函数

    block: (T) -> R
    

    在let的参数中,可以看到上面的Lambda函数。同样,调用对象作为函数的参数传递。因此,可以在函数内部使用调用类对象。然后返回R(另一个对象)。
    示例:

    val phoneNumber = "138888888888"
    //String调用对象作为Lambda函数的参数,返回Pair类型
    val numberAndCount: Pair<Int, Int> = phoneNumber.let { it.toInt() to it.count() }
    

    also函数

    源码:

    public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
    

    将调用类作为Lambda函数的参数,但不返回任何值
    示例:

    val phoneNumber = "138888888888"
    phoneNumber.also { number ->
        println(number.contains("8"))
        println(number.length)
     }
    

    apply函数

    源码:

    public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
    

    与also函数类似,但作为函数传递的调用对象相同,因此可以不用调用T参数直接使用T的方法和属性(在Lambda函数内部直接调用String类的属性方法)。
    示例:

    val phoneNumber = "138888888888"
    phoneNumber.apply { 
        println(contains("8"))
        println(length)
     }
    

    takeIf函数

    源码:

    public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
    

    predicate 函数将 T 对象作为参数;根据 predicate 的结果最终返回 this 或 null。
    示例:

    val phoneNumber = "138888888888"
    //number只有当phoneNumber与正则表达式匹配时才等于字符串phoneNumber。 否则number将为null
    val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) }
    

    takeUnless函数

    源码:

    public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
    

    示例:

    val phoneNumber = "138888888888"
    //与takeIf相反,number仅在与regex不匹配时才等于字符串phoneNumber.否则它将为null
    val number = phoneNumber.takeUnless { it.matches("[0-9]+".toRegex()) }
    

    相关文章

      网友评论

        本文标题:Kotlin标准函数:takeIf、takeUnless(译文)

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