在when()语句中检查值是否不相等

时间:2019-06-28 08:52:59

标签: kotlin

是否可以在when语句中测试String是否相等?

这当然可以通过simpel if语句完全实现:

val storedValue = sharedPreferences.getString(identifier, NOT_SET)
if (storedValue != NOT_SET) {
    super.setValue(storedValue)
}

但是,我喜欢如何将storedValue定义在此代码段的when语句中:

when (val storedValue = sharedPreferences.getString(identifier, NOT_SET)) {
    NOT_SET -> {}
    else -> super.setValue(storedValue)
}

下降是NOT_SET条目的空代码块。 可以将这两者结合吗?

我想界定storedValue的范围,并摆脱空的代码块。结果将类似于:

when (val storedValue = sharedPreferences.getString(identifier, NOT_SET)) {
    !NOT_SET -> super.setValue(storedValue)
}

由于SharedPreferences是Android框架的一部分,因此这是另一种解决方案:

if (sharedPreferences.contains(identifier)) {
    super.setValue(sharedPreferences.getString(identifier, null))
}

但是,我的问题的目的是为了学习而更深入地了解Kotlin的可能性。

1 个答案:

答案 0 :(得分:1)

如评论中所述,甚至在Kotlin中,在when语句中还没有像这样直接支持否定。

目前最惯用的方式是:

val storedValue = sharedPreferences.getString(identifier, NOT_SET)
when {
    storedValue != "NOT_SET" -> super.setValue(storedValue)
}

另一个在何时使用!in的有效变体可能是:

when (val storedValue = sharedPreferences.getString(identifier, NOT_SET)) {
     !in setOf("NOT_SET") -> super.setValue(storedValue)
}

由于!=!in都将区分大小写,因此获取类似sharedPreferences.getString(identifier, NOT_SET).toUpperCase()的字符串或在第一个变体中使用equalsIgnoreCase都是有意义的。 / p>