美文网首页
Kotlin takeIf 和 takeUnless区别

Kotlin takeIf 和 takeUnless区别

作者: 因为我的心 | 来源:发表于2022-11-22 17:00 被阅读0次

    一、前言:

    我们使用kotlin的时候,会经常用到一些如let、apply、run这些作用域函数,它能让我们方便、简洁地链式调用对象的方法,除了这些,Kotlin标准库还提供了 takeIf 函数和 takeUnless 函数. 这些函数允许你在链式调用中加入对象的状态检查。

    二、使用:

    1、看看 takeIf 和 takeUnless 的实现:

    // takeIf
    public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
        contract {
            callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
        }
        return if (predicate(this)) this else null
    }
    
    
    // takeUnless
    public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
        contract {
            callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
        }
        return if (!predicate(this)) this else null
    }
    

    takeIf : 接收一个判断条件表达式,如果判断表达式为 true 则返回对象本身,false返回 null。
    takeUnless: 与 takeIf 相反, 如果判断表达式为 true 则返回 null,false 返回对象本身。

    2、该对象可以作为 lambda 参数 (it) 使用,过滤条件位于函数的 {} 中

    特别注意:Kotlin.run方法一定要先敲run带出Kotlin.;不能先敲Kotlin.会报错,识别不了Kotlin类

     //1、简单使用
            val number = 61
            val evenOrNull = number.takeIf { it % 2 == 0 }
            val oddOrNull = number.takeUnless { it % 2 == 0 }
            //偶数: null, 奇数: 61
            Log.d("LUO", "偶数: $evenOrNull, 奇数: $oddOrNull")
    
            //2、链式调用
            val str = "Hello"
            val caps = str.takeIf { it.isNotEmpty() }?.toUpperCase()
            //caps: HELLO
            Log.d("LUO", "caps: $caps")
    
            //3、会执行takeIf和also
            "AA".takeIf {
                Log.d("LUO", "----takeIf----")
                it.isNotBlank()
            }?.also {
                Log.d("LUO", "----also----")
                ""
            } ?: kotlin.run {
                Log.d("LUO", "----kotlin.run----")
            }
    
            //4、会执行takeIf和kotlin.run
            //特别注意:Kotlin.run方法一定要先敲run带出Kotlin.;不能先敲Kotlin.会报错,识别不了Kotlin类
            "".takeIf {
                Log.d("LUO", "----takeIf----")
                it.isNotBlank()
            }?.also {
                Log.d("LUO", "----also----")
                ""
            } ?: kotlin.run {
                Log.d("LUO", "----kotlin.run----")
            }
    
            //5、字符串判断
            val str1 = "".takeUnless { it.isNullOrBlank() }?:"未设置姓名"
            val str2 = "".takeIf { !it.isNullOrBlank() }?:"未设置年龄"
            Log.d("LUO", "str1:$str1")
            Log.d("LUO", "str2:$str2")
    

    参考:https://www.jianshu.com/p/2151aae07a27

    相关文章

      网友评论

          本文标题:Kotlin takeIf 和 takeUnless区别

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