首先先来看看takeIf 和 takeUnless 的实现:

//takeIf
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    ...
    return if (predicate(this)) this else null
}


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

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

takeUnless:  与takeIf相反,  如果判断表达式为true则返回 null,false返回 对象本身

 

所以有这么一种场景可以使用,如请求后台返回了一个UserCallback对象,需要在界面显示这个UserCallback包含的一个address字符串,如果返回的address如果是null或空字符串则显示“未设置”。.

以前这种场景一般都是这样实现的:

val addr = UserCallback.address
textView.text = if (addr.isNullOrBlank()) "未设置" else addr

 

但使用takeIf 或 takeUnless 可以这样实现更为直接

textView.text = UserCallback.address.takeUnless { it.isNullOrBlank() }?:"未设置"

//或者使用takeIf的写法
//textView.text = UserCallback.address.takeIf { !it.isNullOrBlank() }?:"未设置"

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐