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

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

Операторы ветвления Kotlin»

Здравствуйте. Что такое операторы ветвления или условные операторы? Представьте себе, что вы хотите войти в определенное заведение, и сотрудник проверяет ваш возраст. Если вам больше 18 лет, он пропускает вас внутрь, если нет — отправляет домой. Именно так работают условные операторы в программировании. Ключевое здесь «если».

В прошлом уроке мы получали булево значение и распечатывали его в консоль. Напомню гипотетический сценарий программы: при определенном пороге возраста нужно показывать страницу со скрытым контентом, например, при проверке возраста для покупки алкоголя в интернет-магазине. Это ничто иное как условие. Мы говорим: “Если возраст больше или равен 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 при каждом тестировании. Для этого вызовем функцию readln(), которая, при запуске программы, вызовет чтение данных из консоли и будет сохранять всё, что введено, в переменную userAge. Под капотом эта функция приводит все введенные данные к строковому типу, то есть, вне зависимости от того, вводим ли мы число или буквенные символы, всё сохраняется как строка. Но мы работаем с числами, поэтому во избежание ошибки необходимо добавить вызов ещё одной функции toInt().

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

val userAge = readln().toInt()

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

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

Конструкция if — 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 — печатать в консоль фразу “Показать экран с ограниченным контентом, имитируя действие в приложении”, например, для товаров с ограничением по возрасту, таким как игры с рейтингом 16+.

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

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

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

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

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

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

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

Отлично. Есть ещё одна особенность языка Kotlin. Конструкции 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 в Kotlin

Окей. Наконец расскажу про конструкцию when. Эта конструкция сравнивает переданные ей данные со значениями, которые мы перечисляем ниже. Конструкция может быть более читабельной альтернативой множеству if else блоков, особенно при большом количестве условий, и обычно используется там, где больше двух ветвлений. При совпадении программа выполняет определённый код в соответствующем блоке. То есть, дословно: “когда значение является таким-то, нужно выполнить такой-то код”.

Для демонстрации будем проверять число 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() и оставить просто возвращаемую строку. Иначе вы вернете результат вызова функции 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)

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

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

Бесплатные Telegram-боты для обучения

Практика с проверкой кода и помощью ИИ-ментора

AndroidSprint AI Mentor

Проверяет Pull Request'ы в GitHub, проводит тестовые собеседования с голосом и таймером, помогает разбираться с кодом 24/7

Попробовать ИИ-ментора →

KotlinSprint Bot

22 урока Kotlin, 220 тестов, 120 практических задач с код-ревью

Начать обучение Kotlin →

AndroidSprint Bot

Тесты по Android SDK, Jetpack Compose, архитектуре приложений

Тесты по Android →

Тебе также может быть интересно

Узнать подробнее
Курс AndroidSprint

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Курс AndroidSprint - Глубокое <strong>обучение Android разработке с 0 до получения оффера</strong>. Только персональная практика с гарантией получения продуктового опыта.
Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Практикум по Kotlin - Изучение Котлин <strong>с 0 для профессиональной разработки</strong>. Личный ментор и разбор кода задач через git-flow.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Бесплатные уроки по Kotlin разработке - <span>Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.</span>
Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Onboarding в разработку - <span>Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь</span>
Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Обучающий Kotlin телеграм бот (с тестами) - Ваш основной <span>инструмент для изучения основ языка.</span> Бесплатные тесты и практика внутри.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Бесплатные уроки  по Android разработке - Самостоятельное <span>обучение разработке Андроид приложений.</span> Понятные видеоуроки с разжеванными примерами.
Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Курс по UI/Unit тестированию - Для ручных тестировщиков, которые <span>готовы осваивать автотесты</span> с использованием актуального стека технологий. [в разработке]
Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Обучающий Android телеграм бот (с тестами) - Бесплатные <span>теоретические тесты для самопроверки.</span> А также информер на практических спринтах по Android.
Узнать подробнее