一、前言:
我们使用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")
网友评论