表达式时如何在 Kotlin 中使用像 isNullOrEmpty 这样的检查
How to use checks like isNullOrEmpty in Kotlin when expressions
与许多其他编程语言一样,Kotlin 提供了像 isNullOrEmpty 这样的检查,它允许像 myString.isNullOrEmpty()
.
这样简单地检查变量
有没有办法将这种检查与 when expression 结合起来?默认情况下,表达式只允许显式字符串。这样的事情可能吗?:
when (myString) {
"1" -> print("1")
"2" -> print("1")
myString.isNullOrEmpty() -> print("null or empty") //This is what I am looking for
else -> print("None of them")
}
您可以像这样消除 when
的参数:
when {
myString == "1" -> print("1")
myString == "2" -> print("2")
myString.isNullOrEmpty() -> print("null or empty")
else -> print("None of them")
}
或明确地说“null 或空字符串”:
when (myString) {
"1" -> print("1")
"2" -> print("2")
null, "" -> print("null or empty")
else -> print("None of them")
}
更新
我没有测试过这个,但后来意识到逻辑是颠倒的:)
所以当它不是 null 或 Empty 时你想 return null(这听起来很混乱)但这是因为你想 return 确切的字符串(来源)if 它为 null 或空,因此 when 语句匹配(记住你正在比较字符串),因此它进入“为 null 或空”分支。
这是一个更新版本:
fun CharSequence?.nullOrEmpty(): CharSequence? =
if (isNullOrBlank().not()) null else this
有点混乱,所以你必须找到一个更好听的名字:)
或者,您可以创建一个常规函数,例如:
fun nullOrEmpty(source: String?): String? =
if (source.isNullOrEmpty().not()) null else source
然后这样称呼它:
when (source) {
"1" -> print("1")
"2" -> print("2")
nullOrEmpty(source) -> print("It's null or empty")
else -> print("none")
}
再说一次,命名应该改进(祝你好运,命名很难!):)
也考虑 isNullOrBlank()
,因为那个也会阻止像 " "
这样的字符串,而 empty 只检查 length == 0
旧答案。
Vadik 的回答是正确的;如果你想要一个“功能”,你可以扩展一个:
fun irrelevant(source: String?) {
when (source) {
"1" -> print("1")
"2" -> print("1")
source.nullOrEmpty() -> print("null or empty")
else -> print("none")
}
}
fun CharSequence?.nullOrEmpty(): CharSequence? = if (isNullOrEmpty()) null else this
与许多其他编程语言一样,Kotlin 提供了像 isNullOrEmpty 这样的检查,它允许像 myString.isNullOrEmpty()
.
有没有办法将这种检查与 when expression 结合起来?默认情况下,表达式只允许显式字符串。这样的事情可能吗?:
when (myString) {
"1" -> print("1")
"2" -> print("1")
myString.isNullOrEmpty() -> print("null or empty") //This is what I am looking for
else -> print("None of them")
}
您可以像这样消除 when
的参数:
when {
myString == "1" -> print("1")
myString == "2" -> print("2")
myString.isNullOrEmpty() -> print("null or empty")
else -> print("None of them")
}
或明确地说“null 或空字符串”:
when (myString) {
"1" -> print("1")
"2" -> print("2")
null, "" -> print("null or empty")
else -> print("None of them")
}
更新
我没有测试过这个,但后来意识到逻辑是颠倒的:)
所以当它不是 null 或 Empty 时你想 return null(这听起来很混乱)但这是因为你想 return 确切的字符串(来源)if 它为 null 或空,因此 when 语句匹配(记住你正在比较字符串),因此它进入“为 null 或空”分支。
这是一个更新版本:
fun CharSequence?.nullOrEmpty(): CharSequence? =
if (isNullOrBlank().not()) null else this
有点混乱,所以你必须找到一个更好听的名字:)
或者,您可以创建一个常规函数,例如:
fun nullOrEmpty(source: String?): String? =
if (source.isNullOrEmpty().not()) null else source
然后这样称呼它:
when (source) {
"1" -> print("1")
"2" -> print("2")
nullOrEmpty(source) -> print("It's null or empty")
else -> print("none")
}
再说一次,命名应该改进(祝你好运,命名很难!):)
也考虑 isNullOrBlank()
,因为那个也会阻止像 " "
这样的字符串,而 empty 只检查 length == 0
旧答案。
Vadik 的回答是正确的;如果你想要一个“功能”,你可以扩展一个:
fun irrelevant(source: String?) {
when (source) {
"1" -> print("1")
"2" -> print("1")
source.nullOrEmpty() -> print("null or empty")
else -> print("none")
}
}
fun CharSequence?.nullOrEmpty(): CharSequence? = if (isNullOrEmpty()) null else this