Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
В этом уроке разберём логический тип данных Boolean, операторы сравнения и логические операторы — на практическом примере проверки доступа к контенту по возрасту пользователя.
Важно не путать два похожих оператора:
= — оператор присваивания: данные справа присваиваются переменной слева.== — оператор сравнения: сравнивает два значения между собой.В Kotlin доступны следующие операторы сравнения:
| Оператор | Описание |
|---|---|
> | больше |
< | меньше |
>= | больше или равно |
<= | меньше или равно |
== | равно |
!= | не равно |
Результатом любого сравнения всегда является одно из двух значений: true (истина) или false (ложь). Такие операции называют операциями отношения.
Помимо операторов сравнения значений, существуют операторы ссылочного сравнения:
=== — истина, если две переменные ссылаются на один и тот же объект в памяти.!== — истина, если переменные ссылаются на разные объекты.Это отличается от ==, который сравнивает только значения. Подробнее эта тема понадобится при работе с объектами.
Рассмотрим практический пример: приложение должно открывать скрытый контент только пользователям от 18 лет. Программа получает возраст пользователя и должна вернуть true или false.
Для возрастного порога используем const val — константу уровня компиляции. В отличие от val, значение константы подставляется в байт-код напрямую при компиляции, что увеличивает производительность.
Константы нельзя объявлять локально — они выносятся за пределы функции. По соглашению константы пишутся в стиле UPPER_SNAKE_CASE:
const val AGE_OF_MAJORITY = 18
Возраст пользователя хранится в обычной переменной:
val userAge = 42
Переменная типа Boolean может хранить только true или false. Её можно инициализировать напрямую:
val comparisonResult: Boolean = false println(comparisonResult)
Либо поместить в неё результат сравнения — именно этот подход используется в нашем примере:
val comparisonResult: Boolean = userAge >= AGE_OF_MAJORITY println(comparisonResult) // true, так как 42 >= 18
Данные сначала сравниваются, затем результат присваивается переменной. Оформим вывод с интерполяцией строк:
println("Результат проверки возраста пользователя: $comparisonResult")
Ещё несколько примеров прямого сравнения:
println(0 < -1) // false println(1 == 1) // true println(2 == 3) // false println(7 != 8) // true
Логические операторы позволяют создавать составные условия из нескольких сравнений:
| Оператор | Название | Описание |
|---|---|---|
&& | И | true, если оба условия истинны |
|| | ИЛИ | true, если хотя бы одно условие истинно |
! | НЕ | инвертирует значение: true → false и наоборот |
Расширим задачу: скрытый контент доступен пользователям от 18 до 65 лет. Теперь нужно проверять два условия одновременно.
const val RETIREMENT_AGE = 65 comparisonResult = userAge >= AGE_OF_MAJORITY && userAge <= RETIREMENT_AGE
Оператор && требует, чтобы оба условия были истинны. Если хотя бы одно вернёт false — итоговый результат тоже будет false.
Скобки вокруг отдельных сравнений необязательны, так как приоритет операций уже задан корректно. Однако в сложных выражениях скобки повышают читаемость кода.
Инфиксная альтернатива через функцию and (требует обязательных скобок):
comparisonResult = (userAge >= AGE_OF_MAJORITY) and (userAge <= RETIREMENT_AGE)
Оператор || возвращает true, если хотя бы одно из условий истинно:
comparisonResult = (userAge >= AGE_OF_MAJORITY) || (userAge <= RETIREMENT_AGE)
Оператор ! инвертирует логическое значение: true становится false, и наоборот. Ставится перед переменной или выражением в скобках.
val a = true val b = !a println(b) // false
Запишем условие иначе: доступ открыт, если возраст больше или равен совершеннолетию и при этом не достиг пенсионного:
comparisonResult = (userAge >= AGE_OF_MAJORITY) && !(userAge >= RETIREMENT_AGE)
Читается так: true, если userAge >= 18 и при этом userAge не >= 65.
in — элегантная проверка диапазонаKotlin позволяет сократить проверку вхождения в диапазон с помощью ключевого слова in:
comparisonResult = userAge in AGE_OF_MAJORITY..RETIREMENT_AGE
Читается дословно: результат true, если userAge находится в диапазоне от 18 до 65.
Для проверки вне диапазона используется !in:
comparisonResult = userAge !in AGE_OF_MAJORITY..RETIREMENT_AGE