Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
Циклы позволяют многократно исполнять один и тот же код при определённых условиях. Это даёт два ключевых преимущества: во-первых, мы избегаем дублирования кода; во-вторых, циклы незаменимы, когда количество итераций заранее неизвестно или должно продолжаться на протяжении всего жизненного цикла программы.
Проблема без цикла. Допустим, нужно реализовать рекламный баннер с обратным отсчётом. Без цикла придётся вручную вызывать println пять раз:
println("Реклама закончится через 5") println("Реклама закончится через 4") println("Реклама закончится через 3") println("Реклама закончится через 2") println("Реклама закончится через 1")
Такой подход громоздкий и не масштабируется. Решим задачу с помощью цикла.
Объявим изменяемую переменную counter со значением 5 — это начало обратного отсчёта. Цикл while будет выполнять тело, пока условие в круглых скобках возвращает true.
var counter = 5 while (counter > 0) { println("Реклама закончится через $counter") }
Важно. Этот код создаст бесконечный цикл —
counterникогда не достигнет 0. То же произойдёт приwhile(true). Необходимо уменьшать счётчик на каждой итерации.
Добавим постфиксный декремент counter-- внутрь строки. Поскольку это выражение (а не просто переменная), его нужно обернуть в фигурные скобки ${}:
var counter = 5 while (counter > 0) { println("Реклама закончится через ${counter--}") }
Как работает постфиксный декремент: сначала текущее значение counter подставляется в строку, затем от него отнимается единица. Таким образом, на экране появятся числа от 5 до 1.
Разница между постфиксным и префиксным декрементом:
// Постфиксный: сначала используется значение, потом уменьшается println("Реклама закончится через ${counter--}") // выведет 5, 4, 3, 2, 1 // Префиксный: сначала уменьшается, потом используется значение println("Реклама закончится через ${--counter}") // выведет 4, 3, 2, 1, 0
При префиксном декременте счётчик распечатает и 0, поскольку на момент проверки условия в переменной ещё находилась единица.
Добавим паузу между итерациями. Метод Thread.sleep() приостанавливает поток выполнения на указанное количество миллисекунд (1000 мс = 1 секунда):
var counter = 5 while (counter > 0) { println("Реклама закончится через ${counter--}") Thread.sleep(1000) }
Thread — это класс, отвечающий за управление потоком. Запустив main(), мы запустили процесс с потоком выполнения. Метод sleep() позволяет приостановить этот поток на заданное время.
do { println("${counter--}") Thread.sleep(1000) } while (counter > 0)
Поведение do-while практически идентично while, но с одним ключевым отличием: тело цикла выполнится минимум один раз, вне зависимости от условия. Сначала исполняется код внутри do { }, и только потом проверяется условие.
Даже если условие изначально false, первая итерация всё равно произойдёт:
do { println("${counter--}") Thread.sleep(1000) } while (false)
Итог: используйте while, когда тело цикла может не выполниться ни разу, и do-while, когда хотя бы одно выполнение гарантировано.