Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

when

У Kotlin есть ключевое слово when, которое заменяет оператор switch и позволяет делать более сложные вещи. Выражение when имеет больше возможностей, чем классический switch и позволяет использовать объекты.

Допустим, мы хотим создать мнемоническое правило для цветов радуги: Кот-охотник желает знать, где сидят фазаны.


fun getMnemonic(color: Color) =
    when (color) {
        Color.RED -> "кот"
        Color.ORANGE -> "охотник"
        Color.YELLOW -> "желает"
        Color.GREEN -> "знать"
        Color.BLUE -> "где"
        Color.INDIGO -> "сидят"
        Color.VIOLET -> "фазаны"
}

println(getMnemonic(Color.INDIGO))
// выводит: сидят

В примере мы создали функцию, которой присвоили значение, возвращаемое when. В Java мы так не можем писать. Нам пришлось бы создавать отдельный блок кода switch, не связанный с каким-то методом. В Kotlin такой вариант также возможен при желании.

Вам не нужно использовать break, как в Java. Для комбинирования разных веток используйте запятые.


fun getWarmth(color: Int) = when(color){
    RED, YELLOW -> "warm"
    GREEN -> "neutral"
    BLUE -> "cold"
    else -> "unknown"
}

println(getWarmth(GREEN))
// выводит: neutral

В примере используются укороченные имена цветов из перечисления Color. Перечисление вынесено в область импорта.


import android.graphics.Color.*

Вместо перечислений можно использовать и обычные переменные.

В примере используется ключевое слово else, который является аналогом default и ему передаётся значение, когда ни одно из выражений не выполнится.

Например, мы можем отслеживать видимость компонента ImageView.


button.setOnClickListener(View.OnClickListener {
	// сделаем невидимым
    catImageView.visibility = View.INVISIBLE;
	// смотрим
    when(catImageView.visibility){
        View.VISIBLE -> println("visible")
        View.INVISIBLE -> println("invisible")
        else -> println("gone")
    }
})

В предыдущих примерах возвращаемый результат присваивался функции или использовался сам по себе. Также можно присвоить и обычной переменной.


var x = 5
val result = when (x) {
    0, 1 -> "binary"
    else -> "error"
}
println(result)

В выражении when можно использовать ключевое слово is для проверки принадлежности к экземпляру класса.


fun describe(obj: Any): String =
        when (obj) {
            1 -> "Единица"
            is Cat -> "Кот!"
            "Hello Kitty" -> "Приветствуем котика"
            is Long -> "Long"
            !is String -> "Не строка"
            else -> "Unknown (Неведома зверушка)"
        }

class Cat(val name: String)

val barsik = Cat("Барсик")
println(describe(45))
println(describe("Васька"))
println(describe(475L))
println(describe(1))
println(describe(barsik))

// Результат
Не строка
Unknown (Неведома зверушка)
Long
Единица
Кот!

Можно задействовать интервалы in:


val zarplata = 1000
val cost = when (zarplata) {
    in 1..10 -> "издеваетесь?"
    in 10..100 -> "маловато будет"
    in 100..1000 -> "кота прокормлю"
    in 1000..1000000 -> "на хлеб с икрой!"
    else -> "not rated"
}
println(cost)

Согласная или гласная


val c = 'ы'
when(c) {
    'а', 'е', 'ё', 'и', 'о', 'у', 'я', 'э', 'ы', 'ю' -> println("$c гласная")
    else -> println("$c согласная")
}

Дополнительные материалы

Реклама