表达式时如何在 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