Урок 5: if else when в Kotlin Операторы ветвления или условные операторы

операторы if else when. Операции ветвления - Android [Kotlin] для начинающих

Оператор if else

Напомню гипотетический сценарий программы: при определенном пороге возраста нужно показывать страницу со скрытым контентом. Это ничто иное как условие. Мы говорим — “Если возраст больше или равен 18, то надо сделать какое-то действие”. Условиями напичкана любая программа, поэтому эта тема является базовым столпом по основам программирования.

Конструкция if

Для созданий условий в языке Kotlin есть специальная конструкция if, которая буквально пишется также, как и произносится.

Если возраст пользователя больше или равен 18, выполнить действие распечатки в консоль сообщения — “Показать экран со скрытым контентом”. Действие внутри фигурных скобок выполнится, только если выражение в круглых скобках вернет true. В противном случае программа не зайдет внутрь фигурных скобок и не выполнит код.

val userAge = 42

if (userAge >= AGE_OF_MAJORITY) {
	println("Показать экран со скрытым контентом")
}

const val AGE_OF_MAJORITY = 18
const val RETIREMENT_AGE = 65

Для демонстрации этого добавим еще одно условие if. Если возраст меньше 18, то, допустим, нужно будет вернуть пользователя на главный экран приложения.

if (userAge < AGE_OF_MAJORITY) {
	println("Вернуться на главный экран приложения")
}

Кстати, усовершенствуем программу функцией ввода данных с клавиатуры. Чтобы не менять руками переменную userAge при каждом тестировании. Для этого вызовем функцию readLine(), которая, при запуске программы, вызовет чтение данных из консоли и будет сохранять все что введено в переменную userAge. Но по умолчанию эта функция сохраняет данные в виде строки, а мы работаем с числами. Во избежание ошибки необходимо добавить вызов еще одной функции toInt(). На восклицательные знаки пока не обращаем внимания.

Функция toInt()

toInt() запустит преобразование (или конвертацию) строки типа String в целое число типа Int. Порядок именно такой: сначала вызывается функция чтения с клавиатуры, затем вызывается функция преобразования строки в число, затем готовое число сохраняется в переменную userAge. Из этого также следует, что вводить мы должны теперь только целые числа, иначе программа упадет при парсинге.

val userAge = readline()!!.toInt()

Отлично, потестим. Теперь введенное число будет сравниваться в конструкции if и в зависимости от результата сравнения true или false исполнять или не исполнять код внутри фигурных скобок.

Оператор else

Итак, у нас есть два if условия и всегда верным будет только одно из них. Чтобы оптимизировать запись, сделав ее более лаконичной, добавим еще один оператор ветвления else. Дословно он произносится как “иначе”. Это позволит нам избавиться от второго if. В блоке else будет исполняться код, если условие выше ложное.

if (userAge >= AGE_OF_MAJORITY) {
	println("Показать экран со скрытым контентом")
} else {
	println("Вернуться на главный экран приложения")
}

То есть, если userAge содержит любое число менее 18, выполнится блок else. else работает, только в паре с блоком if.

Конструкции else if

Бывает, что нужно добавить еще одно условие if, чтобы сделать дополнительную проверку. Сделаем это с помощью конструкции else if. Ее можно озвучить как “еще если”. Для примера добавим дополнительное условие. Если возраст пользователя равен 16 или 17 – печатать в консоль фразу “Показать экран с ограниченным контентом”.

if (userAge >= AGE_OF_MAJORITY) {
	println("Показать экран со скрытым контентом")
} else if (userAge == 16 || userAge == 17) {
	println("Показать экран с ограниченным контентом")
} else {
	println("Вернуться на главный экран приложения")
}

Потестируем программу с разными значениями. Программа будет построчно сверху вниз проверять условия в круглых скобках на истину или ложь. Как только одно из условий будет true, выполнится код внутри фигурных скобок и программа перестанет проверять оставшиеся блоки. Зафиксируем: программа выйдет из блоков проверок, когда встретит в одном из блоков истину или, не встретив такого, закончит свое выполнение после отработки блока else.

Формы написания

Первое. Если в фигурных скобках содержится только одна строчка кода, то фигурные скобки можно опустить. Это ухудшит читабельность по началу, но сократит запись. Выглядеть это может так.

if (userAge >= AGE_OF_MAJORITY)
    println("Показать экран со скрытым контентом")
else if(userAge == 16 || userAge == 17)
    println("Показать экран с ограниченным контентом")
else 
    println("Вернуться на главный экран приложения")

Второе. Можно еще больше сократить запись условия с одной строчкой в теле, написав его в одну строку. Логика работы не изменится. В одной строке можно писать и if и else условия вместе, однако, мы следим за качеством оформления кода и ввиду наших длинных условий оставим в таком виде.

Возвращающее значение if else

Отлично. Есть еще одна особенность языка Котлин. Конструкции if else могут возвращать какие-то значения. Что это значит. Например, текст, который сейчас мы печатаем в консоль можно записать в отдельную переменную, и распечатать ее после блоков с уловиями один раз. Первое, что приходит на ум, можно помещать текст в переменную в самом блоке фигурных скобок, но это, в целом, и так может быть очевидно.

Сделаем лучше. Создадим переменную resultText и проинициализируем ее написанным выражением if else. А действие, которое было внутри фигурных скобок (вызов println()) заменим на то самое возвращаемое значение. Проще говоря, текст из условия true запишется в переменную resultText. Естественно, не забываем о наличии строгой типизации. Если в одном условии возвращаем строку типа String, значит в остальных условиях также необходимо возвращать строку.

val resultText = if (userAge >= AGE_OF_MAJORITY) "Показать экран со скрытым контентом"
else if (userAge == 16 || userAge == 17) "Показать экран с ограниченным контентом"
else "Вернуться на главный экран приложения"

println(resultText)

Оператор when в Котлин

Эта конструкция сравнивает переданные ей данные со значениями, которые мы перечисляем ниже. При совпадении программа выполняет определенный код в соответствующем блоке. То есть дословно “когда” значение является “таким-то”, нужно выполнить “такой-то” код.

Для демонстрации будем проверять число userAge. Пишем when и в скобках какое значение будем сравнивать. Далее перечисляем значения, с которыми будем сравнивать переданное значение. Например: 10, 20, 42. Далее справа от них через специальный символ стрелки пишем инструкцию – то, что будет выполнено, если переданное значение будет равно одному из перечисленных значений. Последним значением будет блок else – который имеет уже знакомый смысл. Он выполнится, если ни одного совпадения не произошло. Запустим пример с разными значениями из консоли.

when(userAge) {
    10 -> println("Ввели число 10")
    20 -> println("Ввели число 20")
	42 -> println("Ввели число 42")
	else -> println("Введено другое число")
}

Возвращающее значение when

Как и if else, when может возвращать значение. Для этого создадим переменную и проинициализируем ее значением, которое вернет when. В этом случае также необходимо внутри убрать вызов println() и оставить просто возвращаемую строку.

val consoleNumber = when(userAge) {
    10 -> "Ввели число 10"
    20 -> "Ввели число 20"
	42 -> "Ввели число 42"
    else -> "Введено другое число"
}

println(consoleNumber)

Формы написания многострочных конструкций

Стоит добавить, что в блоках перечисления можно также писать многострочные конструкции, но обязательно в фигурных скобках. Также как это работает с конструкцией if else. Например, добавим еще какое-нибудь действие, прежде, чем будет возвращена строка.

val consoleNumber = when(userAge) {
    10 -> {
            println("Дополнительное действие, если ввели 10")
            "Ввели число 10"
        }
    20 -> "Ввели число 20"
	42 -> "Ввели число 42"
	else -> "Введено другое число"
}

println(consoleNumber)
10
Дополнительное действие, если ввели 10
Ввели число 10

В этом случае инструкция в подходящем блоке будет выполняться построчно сверху вниз. Сначала распечатается в консоль информация о дополнительном действии, затем в переменную consoleNumber вернется и запишется строка о том, что введено число 10. Наконец, переменная с этой строкой будет распечатана в методе println() за пределами конструкции.

Передавать на сравнение и перечисление в конструкцию when можно как базовые типы Int, String, Boolean и так далее, так и объекты, о которых мы будем говорить немного позже.

Для тех, кто собрался стать Android-разработчиком

Пошаговаясхема
Пошаговая
схема

Описание процесса обучения от основ Kotlin до Android-разработчика

Бесплатныеуроки
Бесплатные
уроки

Авторский бесплатный курс по основам языка программирования Kotlin

Обучающийбот
Обучающий
бот

Тренажер и самоучитель по Котлин – бесплатные тесты и практика

Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *