Избегайте условия else в "Когда" в kotlin - PullRequest
0 голосов
/ 04 августа 2020

Согласно документации Когда в Kotlin, else не является обязательным, если компилятор знает, что все значения охвачены. Это очень похоже на emums или sealed class, но как это сделать в случае массивов для чисел от 1 до 5 (startRating).

private fun starMapping(startRating: Int): String {

    return when (startRating) {
        1 -> "Perfect"
        2 -> "Great"
        3-> "Okay"
        4-> "Bad"
        5-> "Terrible"
        // don't want to add else as I believe it is prone to errors.
    }
}

Что-то похожее на это

return when (AutoCompleteRowType.values()[viewType]) {
        AutoCompleteRowType.ITEM -> ItemView(
                LayoutInflater.from(parent.context).inflate(R.layout.item_venue_autocomplete_item_info, parent, false))

        AutoCompleteRowType.SECTION -> SectionView(
                LayoutInflater.from(parent.context).inflate(R.layout.item_venue_autocomplete_section, parent, false)
        )
    }

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Используя оператор when, невозможно исключить предложение else в случае использования целых чисел, потому что компилятор не знает, что возвращать, если startRating не находится в диапазоне 1..5. Вы можете, например, бросить IllegalStateException, если значение не находится в требуемом диапазоне:

private fun starMapping(startRating: Int): String {
    return when (startRating) {
        1 -> "Perfect"
        2 -> "Great"
        3-> "Okay"
        4-> "Bad"
        5 -> "Terrible"
        else -> throw IllegalStateException("Invalid rating param value")
    }
}

Или вы можете сделать что-то вроде этого:

return when {
    startRating <= 1 -> "Perfect"
    startRating == 2 -> "Great"
    startRating == 3 -> "Okay"
    startRating == 4 -> "Bad"
    else -> "Terrible"
}

Но else пункт обязателен.

0 голосов
/ 04 августа 2020

Возможно, вы вообще не захотите использовать when для этого. Вот что я предлагаю:

Вы можете создать класс перечисления следующим образом:

enum class Rating(val score: Int) {
  Perfect(1),
  Great(2),
  Okay(3),
  Bad(4),
  Terrible(5)
}

И использовать его так:

fun ratingForScore(score: Int) = Rating.values().firstOrNull {
    it.score == score
}?.toString()

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