Условные конструкции

Последнее обновление: 24.05.2021

Условные конструкции позволяют направить выполнение программы по одному из путей в зависимости от условия.

if...else

Конструкция if принимает условие, и если это условие истинно, то выполняется последующий блок инструкций.

val a = 10
if(a == 10) {

	println("a равно 10")
}

В данном случае в конструкции if проверяется истинность выражения a == 10, если оно истинно, то выполняется последующий блок кода в фигурных скобках, и на консоль выводится сообщение "a равно 10". Если же выражение ложно, тогда блок кода не выполняется.

Если необходимо задать альтернативный вариант, то можно добавить блок else:

val a = 10
if(a == 10) {
	println("a равно 10")
}
else{
	println("a НЕ равно 10")
}

Таким образом, если условное выражение после оператора if истинно, то выполняется блок после if, если ложно - выполняется блок после else.

Если блок кода состоит из одного выражения, то в принципе фигурные скобки можно опустить:

val a = 10
if(a == 10)
	println("a равно 10")
else
	println("a НЕ равно 10")

Если необходимо проверить несколько альтернативных вариантов, то можно добавить выражения else if:

val a = 10
if(a == 10) {
	println("a равно 10")
}
else if(a == 9){
	println("a равно 9")
}
else if(a == 8){
	println("a равно 8")
}
else{
	println("a имеет неопределенное значение")
}

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

Стоит отметить, что конструкция if может возвращать значение. Например, найдем максимальное из двух чисел:

val a = 10
val b = 20
val c = if (a > b) a else b

println(c)	// 20

Если при определении возвращаемого значения надо выполнить еще какие-нибудь действия, то можно заключить эти действия в блоки кода:

val a = 10
val b = 20
val c = if (a > b){
	println("a = $a")
	a
} else {
	println("b = $b")
	b
}

В конце каждого блока указывается возвращаемое значение.

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

Конструкция when проверяет значение некоторого объекта и в зависимости от его значения выполняет тот или иной код. Конструкция when аналогична конструкции switch в других языках. Формальное определение:

when(объект){
	
	значение1 -> действия1
	значение2 -> действия2
	
	значениеN -> действияN
}

Если значение объекта равно одному из значений в блоке кода when, то выполняются соответствующие действия, которые идут после оператора -> после соответствующего значения.

Например:

fun main() {

    val isEnabled = true
    when(isEnabled){
        false -> println("isEnabled off")
        true -> println("isEnabled on")
    }
}

Здесь в качестве объекта в конструкцию when передается переменная isEnabled. Далее ее значение по порядку сравнивается со значениями в false и true. В данном случае переменная isEnabled равна true, поэтому будет выполняться код

println("isEnabled on")

Выражение else

В примере выше переменная isEnabled имела только два возможных варианта: true и false. Однако чаще бывают случаи, когда значения в блоке when не покрывают все возможные значения объекта. Дополнительное выражение else позволяет задать действия, которые выполняются, если объект не соответствует ни одному из значений. Например:

val a = 30
when(a){
	10 -> println("a = 10")
	20 -> println("a = 20")
	else -> println("неопределенное значение")
}

То есть в данном случае если переменная a равна 30, поэтому она не соответствует ни одному из значений в блоке when. И соответственно будут выполняться инструкции из выражения else.

Если надо, чтобы при совпадении значений выполнялось несколько инструкций, то для каждого значения можно определить блок кода:

var a = 10
when(a){
	10 -> {
		println("a = 10")
		a *= 2
	}
	20 -> {
		println("a = 20")
		a *= 5
	}
	else -> { println("неопределенное значение")}
}
println(a)

Сравнение с набором значений

Можно определить одни и те же действия сразу для нескольких значений. В этом случае значения перечисляются через запятую:

val a = 10
when(a){
	10, 20 -> println("a = 10 или a = 20")
	else -> println("неопределенное значение")
}

Также можно сравнивать с целым диапазоном значений с помощью оператора in:

val a = 10
when(a){
	in 10..19 -> println("a в диапазоне от 10 до 19")
	in 20..29 -> println("a в диапазоне от 20 до 29")
	!in 10..20 -> println("a вне диапазона от 10 до 20")
	else -> println("неопределенное значение")
}

Если оператор in позволяет узнать, есть ли значение в определенном диапазоне, то связка операторов !in позволяет проверить отсутствие значения в определенной последовательности.

when и динамически вычисляемые значения

Выражение в when также может сравниваться с динамически вычисляемыми значениями:

fun main() {

    val a = 10
    val b = 5
    val c = 3
    when(a){
        b - c -> println("a = b - c")
        b + 5 -> println("a = b + 5")
        else -> println("неопределенное значение")
    }
}

Так, в данном случае значение переменной a сравнивается с результатом операций b - c и b + 5.

Кроме того, when также может может принимать динамически вычисляемый объект:

fun main() {

    val a = 10
    val b = 20
    when(a + b){
        10 -> println("a + b = 10")
        20 -> println("a + b = 20")
        30 -> println("a + b = 30")
        else -> println("Undefined")
    }
}

Можно даже определять переменные, которые будут доступны внутри блока when:

fun main() {

    val a = 10
    val b = 26
    when(val c = a + b){
        10 -> println("a + b = 10")
        20 -> println("a + b = 20")
        else -> println("c = $c")
    }
}

when как альтернатива для if..else

Причем в принципе нам необязатльно вообще сравнивать значение какого-либо объекта. Конструкция when аналогично конструкции if..else просто может поверять набор условий и если одно из условий возвращает true, то выполнять соответствующий набор действий:

fun main() {

    val a = 15
    val b = 6
    when{
        (b > 10) -> println("b больше 10")
        (a > 10) -> println("a больше 10")
        else -> println("и a, и b меньше или равны 10")
    }
}

Возвращение значения

Как и if конструкция when может возвращать значение. Возвращаемое значение указывается после оператора ->:

val sum = 1000

val rate = when(sum){
	in 100..999 -> 10
	in 1000..9999 -> 15
	else -> 20
}
println(rate)		// 15

Таким образом, если значение переменной sum располагается в определенном диапазоне, то возвращается то значение, которое идет после стрелки.

Помощь сайту
WebMoney
  • P378451176208
  • Z280152397659
ЮMoney/Яндекс-Деньги
  • 410011174743222
PayPal
  • metanit22@mail.ru
Перевод на карту
  • Номер карты: 4048415020898850