Управление потоком выполнения
Как и другие языки программирования, Kotlin позволяет принимать решения на основе того, является ли результат вычисления фрагмента кода истинным. Такие фрагменты кода называются условными выражениями. Kotlin также позволяет создавать циклы и выполнять итерации по ним.
Условные выражения
В Kotlin для проверки условных выражений предусмотрены if и 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 :( в противном случае.
- Подсказка
Для сравнения результатов броска используйте оператор равенства (
==).
import kotlin.random.Random
fun main() {
val firstResult = Random.nextInt(6)
val secondResult = Random.nextInt(6)
// Write your code here
}
Упражнение 2
Используя выражение when, измените приведённую программу так, чтобы она выводила соответствующие действия при вводе названий кнопок игровой консоли.
Кнопка |
Действие |
|---|---|
A |
Да |
B |
Нет |
X |
Меню |
Y |
Ничего |
Другая |
Такой кнопки нет |
fun main() {
val button = "A"
println(
// Write your code here
)
}
Диапазоны
Прежде чем перейти к циклам, полезно узнать, как создавать диапазоны, по которым циклы выполняют итерации.
Самый распространённый способ создать диапазон в 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 продолжаться.Добавьте действие, которое нужно выполнить, в фигурные скобки
{}.
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")
}
Упражнение 2
Напишите программу, имитирующую игру Fizz buzz. Ваша задача — последовательно вывести числа от 1 до 100, заменяя каждое число, кратное трём, словом «fizz», а каждое число, кратное пяти, — словом «buzz». Числа, кратные и 3, и 5, нужно заменить словом «fizzbuzz».
- Подсказка 1
Используйте цикл
forдля подсчёта чисел и выражениеwhen, чтобы определить, что выводить на каждом шаге.
- Подсказка 2
Используйте оператор остатка от деления (
%), чтобы получить остаток от деления числа. Используйте оператор равенства (==), чтобы проверить, равен ли остаток нулю.
fun main() {
// Write your code here
}
Упражнение 3
У вас есть список слов. Используйте for и if, чтобы вывести только слова, начинающиеся с буквы l.
- Подсказка
Используйте функцию
.startsWith()для типаString.
fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
// Write your code here
}
© 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