Наиболее распространенным способом управления порядком выполнения программы является использование выражения if
, которое указывает программе на выполнение определенного действия при определенном условии.
Содержание статьи
- Пример использования if
- Пример использования else
- Применение выражения else-if
- Условия AND и OR для IF-выражения
- Область видимости переменных в IF-выражении
- Задания для проверки
Пример использования if
Рассмотрим следующий пример:
1 2 3 4 5 | fun main() { if (2 > 1) { println("Да, 2 больше чем 1.") } } |
Это простое выражение if
. Если условие истинно, то выражение выполнит код между фигурными скобками. Если условие ложно, то выражение не будет выполнять данный код. Все просто!
Термин выражение if используется здесь вместо оператора if, поскольку, в отличие от многих других языков программирования, в Kotlin значение возвращается из выражения if
. Возвращаемое значение является значением последнего выражения в блоке if
.
От вас не требуется использовать возвращаемое значение или присваивать его переменной. Подробнее о возврате значения будет рассказано ниже.
Пример использования else
Вы можете расширить выражение if
, чтобы указать действия для случая, когда условие ложное. Это называется условием else. К примеру:
1 2 3 4 5 6 7 8 9 | fun main() { val animal = "Лиса" if (animal == "Кошка" || animal == "Собака") { println("Это домашнее животное.") } else { println("Это дикое животное.") } } |
Здесь, если константа animal
была бы равна "Кошка"
или "Собака"
, тогда выражение выполняет первый блок кода. Если константа animal
не равна ни "Кошка"
, ни "Собака"
, тогда выражение выполняет блок внутри else
от if
выражения, выводя на консоль следующее:
1 | Это дикое животное. |
Также можно использовать выражение if-else
в одну строку. Рассмотрим, как это поможет сделать код более кратким и читабельным.
Если нужно определить минимальное и максимальное значение из двух переменных, можно использовать выражение if
следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | fun main() { val a = 5 val b = 10 val min: Int if (a < b) { min = a } else { min = b } val max: Int if (a > b) { max = a } else { max = b } } |
На данный момент вам должно быть понятно, как это работает, но здесь используется довольно много кода. Взглянем, как можно улучшить код через использование выражения if-else
, которое возвращает значение.
Просто уберем скобки и поместим все в одну строку следующим образом:
1 2 3 4 5 6 7 | fun main() { val a = 5 val b = 10 val min = if (a < b) a else b val max = if (a > b) a else b } |
В первом примере мы имеем условие a < b
. Если это истинно, то результат, присваиваемый назад в константу min
, будет значение из константы a
. Если ложно, то результат будет значением из константы b
. Значение в константе min
будет 5
. Во втором примере, max
присваивается значение b
, которым является 10
.
Так намного проще! Это пример идиоматического кода, который означает, что код пишется ожидаемым образом для определенного языка программирования. Идиомы не только улучшают код, но и позволяют другим разработчикам, знакомым с языком, быстро понять чужую программу.
На заметку: Так как поиск большего или меньшего из двух чисел является очень распространенной операцией, стандартная библиотека Kotlin предоставляет для этой цели две функции:
max()
иmin()
. Наверняка в прошлых уроках вы уже встречали их.
Применение выражения else-if
Выражения if
можно использовать более эффективно. Иногда нужно проверить одно условие, затем другое. Здесь вступает в игру else-if
, встраивая другое выражение if
в условие else
предыдущего условия if
.
Вы можете использовать else-if
следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | fun main() { val hourOfDay = 12 val timeOfDay = if (hourOfDay < 6) { "Раннее утро" } else if (hourOfDay < 12) { "Утро" } else if (hourOfDay < 17) { "После полудня" } else if (hourOfDay < 20) { "Вечер" } else if (hourOfDay < 24) { "Поздний вечер" } else { "НЕДЕЙСТВИТЕЛЬНЫЙ ЧАС!" } println(timeOfDay) } |
Данные вложения if
проверяют несколько условий одно за другим, пока не будет найдено истинное условие. Выполняется только тело-if, связанный с первым истинным условием, независимо от того, истинны ли последующие условия else-if
. Другими словами, важен порядок ваших условий.
В конце можно добавить вложение else
для обработки случая, когда ни одно из условий не выполняется. Если условие else
не нужно, его можно не использовать. В этом примере оно требуется, чтобы гарантировать, что константа timeOfDay
обладает допустимым значением ко времени его вывода.
В данном примере выражение if
принимает число, являющееся временем, и преобразует его в строку, представляющую часть дня, которой принадлежит время. При работе в 24-часовом формате условия проверяются в следующем порядке, по одному пункту за раз:
- Сначала проверяется, если время меньше 6. Если так, значит, это раннее утро;
- Если время не меньше 6, тогда выражение продолжается до первого условия
else-if
, где проверяется, является ли время меньше 12; - Когда условие оказывается ложным, выражение проверяет, является ли время меньше 17, затем меньше ли 20, затем меньше ли 24;
- В конечном итоге, если время за пределами диапазона, выражение возвращает недействительное значение.
В коде выше константа hourOfDay
равна 12
. Следовательно, код выведет следующее:
1 | После полудня |
Обратите внимание, что хотя оба условия hourOfDay < 20
и hourOfDay < 24
истинны, выражение выполняет и возвращает только первый блок, чье условие истинно. В данном случае это блок с условием hourOfDay < 17
.
Условия AND и OR для IF-выражения
Важным аспектом выражений if
и булевых операторов является то, что происходит, когда несколько логических условий разделяются путём использования AND (&&
) или OR (||
).
Рассмотрим следующий код:
1 2 3 4 5 6 7 8 9 10 | fun main() { val name = "Андрей" val age = 15 if (age > 18 && name == "Андрей") { println("Да, это Андрей и ему больше 18 лет!") } else { println("Не подходит по правилам - они у нас строгие!") } } |
Результат:
1 | Не подходит по правилам - они у нас строгие! |
Первое условие if-выражения, age > 18
, ложно. Поэтому все выражение никак не может быть истинным — так как мы используем строгую проверку через AND &&
. Поэтому Kotlin даже не потрудится проверить вторую часть выражения, а именно проверку имени.
Теперь давайте заменим &&
на ||
OR (или):
1 2 3 4 5 6 7 8 9 10 | fun main() { val name = "Андрей" val age = 15 if (age > 18 || name == "Андрей") { println("Это либо Андрей, либо ему больше 18 лет...") } else { println("Ни один критерий не подходит.") } } |
Результат:
1 | Это либо Андрей, либо ему больше 18 лет... |
В этом коде проверка age > 18
вернёт false, но вот проверка по имени name == "Андрей"
вернёт true. Так как мы использовали проверку через ||
(или), то имея хотя бы один true — будет выполнен первый кусок кода из фигурных скобок if-выражения.
Область видимости переменных в IF-выражении
Вместе с выражениями if
вводится новый концепт — область видимости, которая является способом инкапсуляции переменных через использование фигурных скобок.
Представьте, что вам нужно посчитать оплату, которую вам должен заплатить клиент. Условия сделки заключаются в том, что вы зарабатываете 25 долларов каждый час до 40 часов работы. После этого времени вы получаете по 50 долларов в час.
Используя Kotlin, оплату можно посчитать следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 | fun main() { var hoursWorked = 45 var price = 0 if (hoursWorked > 40) { val hoursOver40 = hoursWorked - 40 price += hoursOver40 * 50 hoursWorked -= hoursOver40 } price += hoursWorked * 25 println(price) } |
Данный код принимает количество часов и проверяет, не превышает ли оно 40. Если да, то код вычисляет количество часов, превышающее 40, и умножает его на 50 долларов, а затем добавляет результат к цене. Затем код вычитает количество часов, превышающих 40, из отработанных часов. Остальные отработанные часы умножаются на 25 долларов и прибавляются к общей стоимости.
Результат примера выглядит следующим образом:
1 | 1250 |
Интересен код внутри выражения if
. Здесь объявляется новая константа hoursOver40
для хранения количества часов, превышающих 40. Вы можете использовать ее внутри оператора if
.
Поскольку 1 < 2
истинно, все выражение также должно быть истинным. Поэтому еще раз проверка name
не выполняется. Это пригодится позже, когда вы начнете работать с более сложными типами данных.
Но что произойдет при попытке использовать его в конце кода свыше?
1 2 3 4 | ... println(price) println(hoursOver40) |
Будет получена ошибка:
1 | Unresolved reference: 'hoursOver40' |
Ошибка сообщает, что вам нельзя использовать константу hoursOver40
вне области видимости, в которой она была создана. Обратите внимание, данная константа была создана в тело if выражения.
В данном случае выражение if
вводит новую область видимости, за пределами которой константа становится невидимой.
Каждая область видимости может использовать переменные и константы из родительской области видимости main()
. В примере выше в области видимости внутри выражения if
используются переменные price
и hoursWorked
, которые были созданы в родительской области видимости.
Задания для проверки
- Создайте константу
myAge
, значением которой будет ваш возраст. Напишите выражениеif
для вывода словаПодросток
, если вам от 13 до 19 лет, иНе подросток
, если это не так; - Создайте константу
answer
и используйте однострочное выражениеif-else
, чтобы установить его равным результату, который вы выводили для тех же случаев в приведенном выше упражнении. Затем выведите в консоль результат из константыanswer
.
опечатка? в коде 1 больше 2
Рассмотрим следующий код: