Kotlin takeIf 和 takeUnless区别

2022-11-22  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读