When kotlin двойное условие

Выражения when в Kotlin

Управлять порядком выполнения программы можно с помощью выражения when , которое выполняет разный код в зависимости от значения переменной или константы.

Синтаксис выражения when в Kotlin

Далее представлено выражение when , которое применяется на целое число:

Вывод данного примера будет следующим:

Цель выражения when из примера выше в том, что нужно определить, равно ли число нулю или нет. В будущем будут примеры по сложнее — обещаем!

Чтобы обработать конкретный случай, добавляется значение, за которым следует знак -> , который указывает на код, который будет выполняться, если условие выполнено. Затем используется else, чтобы указать, что должно произойти для всех других значений. В отличие от других языков, таких как Java, в Kotlin нет необходимости включать оператор break в каждую ветвь, поскольку выражение when будет выполнять только первую совпадающую ветвь.

Далее дан еще один пример:

На этот раз проверяется если переменная содержит число 10, если это так, то выводится сообщение. Для других значений ничего не должно происходить.

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

В этом примере предоставляются два значения для первого аргумента. Это означает, что если значение будет равно «Кот» или «Собака» , тогда оператор when выполнит первую ветвь выражения.

Присвоения значения через when

Выражениям when можно предоставить более одной ветки. Поскольку when является выражением, его можно использовать для возврата значения, как и выражение if . Также можно проигнорировать значение, если нужно просто использовать when в качестве оператора.

Выражение when вернет значение из первой ветви с соответствующим аргументом.

Если вы хотите вывести номер из константы number в текстовом формате, то вы можете присвоить значение с помощью выражения when следующим образом:

В ветке else мы использовали фигурные скобки, чтобы включить в ветвь целый блок кода. Последнее значение в блоке возвращается из ветви, поэтому, если number не было в интервале (2, 4, 6, 8, 10) , тогда значением в константе numberName будет «Неизвестный» .

Продвинутые выражения when в Kotlin

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

Данную задачу можно переписать лаконично с помощью when выражения. Например:

Помните интервалы? Что ж, вы можете использовать интервалы, чтобы упростить данное when выражение. Можно переписать приведенный выше код, используя интервалы:

Читайте также:  Google cloud python pip

Это более минималистично и элегантно, чем отдельная запись значений для всех ветвей.

Когда есть несколько ветвей, выражение when выполнит первое соответствующее. Так более сжато и понятно, чем использование if выражения для данного примера.

Это также более точно, потому что использования if не обрабатывает отрицательные числа, которые здесь правильно считаются недействительными.

Также можно сопоставить ветвь с условием на основе свойства значения без каких-либо аргументов, передаваемых выражению when .

Является ли целое число четным или нечетным

Для определения является ли целое число четным или нечетным, можно использовать оператор % для нахождения остатка от деления.

Первая ветвь данного when выражения использует оператор == . Это означает, что аргумент будет совпадать только тогда, когда определенное условие истинно.

В данном примере аргумент был создан таким образом, чтобы он совпадал, если значение четное, то есть если значение остатка после деления на 2 равно 0.

Другой пример более эффективного использования условий в when выражениях:

Что делает каждая из ветвей по порядку:

  1. Выполняется если значения из x, y, z равны (0, 0, 0) . Это координаты точки в 3D пространстве;
  2. Выполняется если y = 0, z = 0 и значение x содержит любое другое значение. Это означает, что координата находится на оси x ;
  3. Выполняется если x = 0, z = 0 и значение y содержит любое другое значение. Это означает, что координата находится на оси y ;
  4. Выполняется если x = 0, y = 0 и значение z содержит любое другое значение. Это означает, что координата находится на оси z ;
  5. Выполняется если данные из каждой координаты разные.

Последняя ветвь с условием else используется по умолчанию. Она соответствует чему угодно, потому что нет ограничений ни на одну часть координат. Вот пример более сложного случая:

Здесь сопоставляются строки “y равен x” и “y равен x в квадрате” . Поскольку у выражения when нет аргумента, вам не нужна ветвь else , а выражение when не будет выполнять ветвь, если нет соответствующего условия. Это основы выражений when !

Задания для проверки

Напишите when выражение, которое принимает возраст как целое число и выводит стадию жизни, относящуюся к данному возрасту. Вы можете создать свои этапы жизни или использовать нашу классификацию:

  • 0-2 года Младенец (Infant);
  • 3-12 лет, Ребенок (Child);
  • 13-19 лет, Подросток (Teenager);
  • 20-39, Взрослый (Adult);
  • 40-60 лет, Средний возраст (Middle aged);
  • 61+, Пожилые (Elderly).

Напишите when выражение, которое разбивает тип Pair, содержащую строку и целое число. Строка это имя, а целое число — возраст человека. Используйте те же случаи, которые вы использовали в предыдущем упражнении, чтобы вывести имя, за которым следует этап жизни. Например, «Иван взрослый.»

Источник

Conditions and loops

In Kotlin, if is an expression: it returns a value. Therefore, there is no ternary operator ( condition ? then : else ) because ordinary if works fine in this role.

Читайте также:  Html and javascript editors

fun main() < val a = 2 val b = 3 //sampleStart var max = a if (a < b) max = b // With else if (a >b) < max = a >else < max = b >// As expression max = if (a > b) a else b // You can also use `else if` in expressions: val maxLimit = 1 val maxOrLimit = if (maxLimit > a) maxLimit else if (a > b) a else b //sampleEnd println(«max is $max») println(«maxOrLimit is $maxOrLimit») >

Branches of an if expression can be blocks. In this case, the last expression is the value of a block:

If you’re using if as an expression, for example, for returning its value or assigning it to a variable, the else branch is mandatory.

When expression

when defines a conditional expression with multiple branches. It is similar to the switch statement in C-like languages. Its simple form looks like this.

when matches its argument against all branches sequentially until some branch condition is satisfied.

when can be used either as an expression or as a statement. If it is used as an expression, the value of the first matching branch becomes the value of the overall expression. If it is used as a statement, the values of individual branches are ignored. Just like with if , each branch can be a block, and its value is the value of the last expression in the block.

The else branch is evaluated if none of the other branch conditions are satisfied.

If when is used as an expression, the else branch is mandatory, unless the compiler can prove that all possible cases are covered with branch conditions, for example, with enum class entries and sealed class subtypes).

enum class Bit < ZERO, ONE >val numericValue = when (getRandomBit()) < Bit.ZERO ->0 Bit.ONE -> 1 // ‘else’ is not required because all cases are covered >

In when statements, the else branch is mandatory in the following conditions:

  • when has a subject of a Boolean , enum , or sealed type, or their nullable counterparts.
  • branches of when don’t cover all possible cases for this subject.

enum class Color < RED, GREEN, BLUE >when (getColor()) < Color.RED ->println(«red») Color.GREEN -> println(«green») Color.BLUE -> println(«blue») // ‘else’ is not required because all cases are covered > when (getColor()) < Color.RED ->println(«red») // no branches for GREEN and BLUE else -> println(«not red») // ‘else’ is required >

To define a common behavior for multiple cases, combine their conditions in a single line with a comma:

Читайте также:  Php session error log

You can use arbitrary expressions (not only constants) as branch conditions

You can also check a value for being in or !in a range or a collection:

when (x) < in 1..10 ->print(«x is in the range») in validNumbers -> print(«x is valid») !in 10..20 -> print(«x is outside the range») else -> print(«none of the above») >

Another option is checking that a value is or !is of a particular type. Note that, due to smart casts, you can access the methods and properties of the type without any extra checks.

when can also be used as a replacement for an if — else if chain. If no argument is supplied, the branch conditions are simply boolean expressions, and a branch is executed when its condition is true:

You can capture when subject in a variable using following syntax:

fun Request.getBody() = when (val response = executeRequest()) < is Success ->response.body is HttpError -> throw HttpException(response.status) >

The scope of variable introduced in when subject is restricted to the body of this when.

For loops

The for loop iterates through anything that provides an iterator. This is equivalent to the foreach loop in languages like C#. The syntax of for is the following:

The body of for can be a block.

As mentioned before, for iterates through anything that provides an iterator. This means that it:

  • has a member or an extension function iterator() that returns Iterator<> :
    • has a member or an extension function next()
    • has a member or an extension function hasNext() that returns Boolean .

    All of these three functions need to be marked as operator .

    To iterate over a range of numbers, use a range expression:

    A for loop over a range or an array is compiled to an index-based loop that does not create an iterator object.

    If you want to iterate through an array or a list with an index, you can do it this way:

    Alternatively, you can use the withIndex library function:

    While loops

    while and do-while loops execute their body continuously while their condition is satisfied. The difference between them is the condition checking time:

    • while checks the condition and, if it’s satisfied, executes the body and then returns to the condition check.
    • do-while executes the body and then checks the condition. If it’s satisfied, the loop repeats. So, the body of do-while executes at least once regardless of the condition.

    Break and continue in loops

    Kotlin supports traditional break and continue operators in loops. See Returns and jumps.

    Источник

Оцените статью