是否可以在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的可能性。
答案 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>