Интервалы в Kotlin
Основная концепция
Интервалы позволяют создавать последовательности значений от начальной до конечной точки. Широко используются в циклах и проверках условий.
Создание интервалов
Базовый оператор ..
Примеры
val numbers = 1..5 // 1,2,3,4,5
val letters = 'a'..'d' // a,b,c,d
val reversed = 5.downTo(1) // 5,4,3,2,1
Исключающий диапазон until
Край не включается
val days = 1 until 7 // 1,2,3,4,5,6 (7 не входит)
Специальные операторы
Комбинирование модификаторов
val steps = 10 downTo 0 step 2 // 10,8,6,4,2,0
val chars = 'z' downTo 'a' step 3 // z,w,t,q...
Проверка вхождения
Операторы in/!in
val age = 25
println(age in 18..30) // true
println(age !in 0..17) // true
val symbol = 'W'
println(symbol in 'A'..'Z') // true (проверка заглавных букв)
Использование в циклах
Классический for с шагом
Перебор с шагом 3
for (i in 0..20 step 3) {
print("$i ") // 0 3 6 9 12 15 18
}
Обратный отсчёт
Пример с downTo
for (num in 5 downTo 1) {
print("$num ") // 5 4 3 2 1
}
Фильтрация символов
Работа с Char диапазонами
for (letter in 'а'..'е') {
print("$letter ") // а б в г д е
}
Продвинутые сценарии
Генерация коллекций
Создание списка из диапазона
val squares = (1..5).map { it * it } // [1, 4, 9, 16, 25]
Проверка пересечения
Пример с диапазонами
val range1 = 10..20
val range2 = 15..25
println(range1.intersect(range2)) // 15..20
Бесконечные последовательности
С generateSequence
val infiniteRange = generateSequence(1) { it + 5 }
infiniteRange.take(5).forEach { print("$it ") } // 1 6 11 16 21
Важные нюансы
- Только для Comparable типов: Int, Long, Char, DateTime и др.
- Эксклюзивные диапазоны: используйте
until
вместо..
там, где нужно исключить верхнюю границу - Производительность: диапазоны с
step
создают промежуточные коллекции - Ошибки при обратном шаге:
// Неправильно:
(1..5 step -1) // Вызовет исключение!
// Правильно:
(5 downTo 1 step 1)