Spec-Zone.ru › Kotlin 2

Управление потоком выполнения

Как и другие языки программирования, Kotlin позволяет принимать решения на основе того, является ли результат вычисления фрагмента кода истинным. Такие фрагменты кода называются условными выражениями. Kotlin также позволяет создавать циклы и выполнять итерации по ним.

Условные выражения

В Kotlin для проверки условных выражений предусмотрены if и when.

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

  • Упрощает чтение кода.

  • Облегчает добавление ещё одной ветви.

  • Помогает избежать ошибок в коде.

If

Чтобы использовать if, добавьте условное выражение в круглые скобки (), а действие, которое нужно выполнить, если результат истинен, — в фигурные скобки {}:

fun main() {
//sampleStart
    val d: Int
    val check = true

    if (check) {
        d = 1
    } else {
        d = 2
    }

    println(d)
    // 1
//sampleEnd
}

В Kotlin нет тернарного оператора condition ? then : else. Вместо него можно использовать if в качестве выражения. Если для каждого действия предусмотрена только одна строка кода, фигурные скобки {} можно не указывать:

fun main() { 
//sampleStart
    val a = 1
    val b = 2

    println(if (a > b) a else b) // Returns a value: 2
//sampleEnd
}

When

Используйте when, если условное выражение содержит несколько ветвей.

Чтобы использовать when:

  • Поместите значение, которое нужно проверить, в круглые скобки ().

  • Поместите ветви в фигурные скобки {}.

  • Используйте -> в каждой ветви, чтобы отделить проверку от действия, которое нужно выполнить, если проверка пройдена.

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

Вот пример использования when в качестве инструкции:

fun main() {
//sampleStart
    val obj = "Hello"

    when (obj) {
        // Checks whether obj equals to "1"
        "1" -> println("One")
        // Checks whether obj equals to "Hello"
        "Hello" -> println("Greeting")
        // Default statement
        else -> println("Unknown")     
    }
    // Greeting
//sampleEnd
}

Обратите внимание: условия ветвей проверяются последовательно, пока одно из них не будет выполнено. Поэтому выполняется только первая подходящая ветвь.

Выражение возвращает значение, которое можно использовать позднее в коде.

Вот пример использования when в качестве выражения. Выражение when сразу присваивается переменной, которая затем используется с функцией println():

fun main() {
//sampleStart    
    val obj = "Hello"    
    
    val result = when (obj) {
        // If obj equals "1", sets result to "one"
        "1" -> "One"
        // If obj equals "Hello", sets result to "Greeting"
        "Hello" -> "Greeting"
        // Sets result to "Unknown" if no previous condition is satisfied
        else -> "Unknown"
    }
    println(result)
    // Greeting
//sampleEnd
}

В обоих примерах when, которые вы видели до сих пор, было проверяемое значение: obj. Однако when можно использовать и без проверяемого значения.

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

fun main() {
    val trafficLightState = "Red" // This can be "Green", "Yellow", or "Red"

    val trafficAction = when {
        trafficLightState == "Green" -> "Go"
        trafficLightState == "Yellow" -> "Slow down"
        trafficLightState == "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)
    // Stop
}

Однако можно написать тот же код, указав trafficLightState в качестве проверяемого значения:

fun main() {
    val trafficLightState = "Red" // This can be "Green", "Yellow", or "Red"

    val trafficAction = when (trafficLightState) {
        "Green" -> "Go"
        "Yellow" -> "Slow down"
        "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)  
    // Stop
}

Использование when с проверяемым значением упрощает чтение и сопровождение кода. Если в выражении when используется проверяемое значение, Kotlin также может проверить, охватывает ли оно все возможные случаи. Если же в выражении when проверяемое значение не используется, необходимо указать ветвь else.

Практика: условные выражения

Упражнение 1

Создайте простую игру, в которой вы выигрываете, если при броске двух игральных костей выпадают одинаковые числа. Используйте if, чтобы вывести You win :), если значения на костях совпадают, и You lose :( в противном случае.

В этом упражнении вы импортируете пакет, чтобы использовать функцию Random.nextInt() для получения случайного значения Int. Подробнее об импорте пакетов см. в разделе Пакеты и импорты.

Подсказка

Для сравнения результатов броска используйте оператор равенства (==).

import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    // Write your code here
}
import kotlin.random.Random fun main() { val firstResult = Random.nextInt(6) val secondResult = Random.nextInt(6) if (firstResult == secondResult) println("You win :)") else println("You lose :(") }

Упражнение 2

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

Кнопка

Действие

A

Да

B

Нет

X

Меню

Y

Ничего

Другая

Такой кнопки нет

fun main() {
    val button = "A"

    println(
        // Write your code here
    )
}
fun main() { val button = "A" println( when (button) { "A" -> "Yes" "B" -> "No" "X" -> "Menu" "Y" -> "Nothing" else -> "There is no such button" } ) }

Диапазоны

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

Самый распространённый способ создать диапазон в Kotlin — использовать оператор ... Например, 1..4 эквивалентно 1, 2, 3, 4.

Чтобы объявить диапазон, не включающий конечное значение, используйте оператор ..<. Например, 1..<4 эквивалентно 1, 2, 3.

Чтобы объявить диапазон в обратном порядке, используйте downTo. Например, 4 downTo 1 эквивалентно 4, 3, 2, 1.

Чтобы объявить диапазон с шагом, отличным от 1, используйте step и укажите нужное значение шага. Например, 1..5 step 2 эквивалентно 1, 3, 5.

То же самое можно сделать и с диапазонами Char:

  • 'a'..'d' эквивалентно 'a', 'b', 'c', 'd'

  • 'z' downTo 's' step 2 эквивалентно 'z', 'x', 'v', 't'

Циклы

Две наиболее распространённые конструкции циклов в программировании — это for и while. Используйте for для перебора диапазона значений и выполнения действия. Используйте while, чтобы продолжать выполнение действия, пока не будет выполнено определённое условие.

For

Используя полученные знания о диапазонах, вы можете создать цикл for, который перебирает числа от 1 до 5 и каждый раз выводит число.

Поместите итератор и диапазон в круглые скобки () вместе с ключевым словом in. Добавьте действие, которое нужно выполнить, в фигурные скобки {}:

fun main() {
//sampleStart
    for (number in 1..5) { 
        // number is the iterator and 1..5 is the range
        print(number)
    }
    // 12345
//sampleEnd
}

Циклы также можно использовать для перебора коллекций:

fun main() { 
//sampleStart
    val cakes = listOf("carrot", "cheese", "chocolate")

    for (cake in cakes) {
        println("Yummy, it's a $cake cake!")
    }
    // Yummy, it's a carrot cake!
    // Yummy, it's a cheese cake!
    // Yummy, it's a chocolate cake!
//sampleEnd
}

While

while можно использовать двумя способами:

  • Выполнять блок кода, пока условное выражение истинно. (while)

  • Сначала выполнить блок кода, а затем проверить условное выражение. (do-while)

В первом случае (while):

  • Объявите в круглых скобках () условное выражение, определяющее, должен ли цикл while продолжаться.

  • Добавьте действие, которое нужно выполнить, в фигурные скобки {}.

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

fun main() {
//sampleStart
    var cakesEaten = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    // Eat a cake
    // Eat a cake
    // Eat a cake
//sampleEnd
}

Во втором случае (do-while):

  • Объявите в круглых скобках () условное выражение, определяющее, должен ли цикл while продолжаться.

  • Определите действие, которое нужно выполнить, в фигурных скобках {} с помощью ключевого слова do.

fun main() {
//sampleStart
    var cakesEaten = 0
    var cakesBaked = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    do {
        println("Bake a cake")
        cakesBaked++
    } while (cakesBaked < cakesEaten)
    // Eat a cake
    // Eat a cake
    // Eat a cake
    // Bake a cake
    // Bake a cake
    // Bake a cake
//sampleEnd
}

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

Теперь, когда вы знаете основы управления потоком выполнения в Kotlin, пора научиться писать собственные функции.

Практика: циклы

Упражнение 1

У вас есть программа, которая считает кусочки пиццы, пока не получится целая пицца из 8 кусочков. Перепишите эту программу двумя способами:

  • Используйте цикл while.

  • Используйте цикл do-while.

fun main() {
    var pizzaSlices = 0
    // Start refactoring here
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    // End refactoring here
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
fun main() { var pizzaSlices = 0 while ( pizzaSlices < 7 ) { pizzaSlices++ println("There's only $pizzaSlices slice/s of pizza :(") } pizzaSlices++ println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D") }
fun main() { var pizzaSlices = 0 pizzaSlices++ do { println("There's only $pizzaSlices slice/s of pizza :(") pizzaSlices++ } while ( pizzaSlices < 8 ) println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D") }

Упражнение 2

Напишите программу, имитирующую игру Fizz buzz. Ваша задача — последовательно вывести числа от 1 до 100, заменяя каждое число, кратное трём, словом «fizz», а каждое число, кратное пяти, — словом «buzz». Числа, кратные и 3, и 5, нужно заменить словом «fizzbuzz».

Подсказка 1

Используйте цикл for для подсчёта чисел и выражение when, чтобы определить, что выводить на каждом шаге.

Подсказка 2

Используйте оператор остатка от деления (%), чтобы получить остаток от деления числа. Используйте оператор равенства (==), чтобы проверить, равен ли остаток нулю.

fun main() {
    // Write your code here
}
fun main() { for (number in 1..100) { println( when { number % 15 == 0 -> "fizzbuzz" number % 3 == 0 -> "fizz" number % 5 == 0 -> "buzz" else -> "$number" } ) } }

Упражнение 3

У вас есть список слов. Используйте for и if, чтобы вывести только слова, начинающиеся с буквы l.

Подсказка

Используйте функцию .startsWith() для типа String.

fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    // Write your code here
}
fun main() { val words = listOf("dinosaur", "limousine", "magazine", "language") for (w in words) { if (w.startsWith("l")) println(w) } }
  • Предыдущий шаг

  • Следующий шаг

12 августа 2026 г.
КоллекцииФункции

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/kotlin-tour-control-flow.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API