0

与许多其他编程语言一样,Kotlin 提供了诸如isNullOrEmpty 之类的检查,它允许简单地检查诸如myString.isNullOrEmpty().

有没有办法将这种检查与when 表达式结合起来?默认情况下,表达式只允许显式字符串。这样的事情可能吗?:

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")
}
4

2 回答 2

4

你可以消除这样的论点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")
}
于 2021-08-03T07:50:15.630 回答
2

更新

我没有测试过这个,但后来意识到逻辑是颠倒的:)

所以你想在它不是 null 或 Empty 时返回 null (这听起来令人困惑)但这是因为如果它是 null 或空你想返回确切的字符串(源),所以 when 语句匹配(记住你正在比较字符串)因此它进入“为空或为空”分支。

这是一个更新的版本:

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(),因为那样会阻止类似的字符串" ",而空只检查length == 0

旧答案。

瓦迪克的回答是正确的;如果你想要一个“功能”,你可以扩展一个:

 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

于 2021-08-03T08:02:21.753 回答