Проверьте, не равно ли значение в выражении when () - PullRequest
2 голосов
/ 28 июня 2019

Можно ли проверить строку на несоответствие в операторе when?

Это, конечно, вполне возможно с помощью простого оператора 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))
}

Однако цель моего вопроса - более глубокое понимание возможностей Котлина ради обучения.

1 Ответ

1 голос
/ 28 июня 2019

Как уже упоминалось в комментариях, отрицание не поддерживается напрямую, как это, когда высказывания (пока) даже в Kotlin.

Наиболее идиоматический способ на данный момент, скорее всего, выглядит так:

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 в первом варианте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...