Зачем нужны последовательности
Отложенное вычисление
«Зачем нужны последовательности» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое последовательности
Sequence похожа на коллекцию, но обрабатывает элементы лениво. Операции не выполняются, пока конечная операция не запросит результат, а элементы проходят через всю цепочку по одному.
Коллекции с немедленной обработкой
Стандартные операции над коллекциями выполняются сразу: каждый шаг — filter, map — полностью обрабатывает список и создаёт новый промежуточный список до начала следующего шага.
fun main() {
val result = listOf(1, 2, 3, 4)
.map { it * 2 }
.filter { it > 4 }
println(result)
}Цена промежуточных списков
При работе с большими объёмами данных немедленная обработка выделяет новый список на каждом шаге. При большом количестве операций или миллионах элементов это расходует лишнюю память и время.
Ленивые последовательности
Последовательность проводит каждый элемент через всю цепочку обработки, прежде чем перейти к следующему. Промежуточные списки не создаются. Преобразуйте коллекцию с помощью asSequence().
fun main() {
val result = listOf(1, 2, 3, 4)
.asSequence()
.map { it * 2 }
.filter { it > 4 }
.toList()
println(result)
}Наблюдение за порядком выполнения
Добавление выводов позволяет увидеть разницу. В последовательности каждый элемент проходит через map, а затем filter, прежде чем начнётся обработка следующего элемента.
fun main() {
listOf(1, 2, 3).asSequence()
.map { println("map $it"); it * 2 }
.filter { println("filter $it"); it > 2 }
.toList()
}Порядок немедленного выполнения
Сравните это с обычным списком: отображение сначала выполняется для всех элементов, затем фильтрация выполняется для всех элементов.
fun main() {
listOf(1, 2, 3)
.map { println("map $it"); it * 2 }
.filter { println("filter $it"); it > 2 }
}Досрочное завершение
Ленивое вычисление позволяет досрочно завершать обработку: такие операции, как first или поиск, останавливаются сразу после нахождения результата и не обрабатывают остальные элементы.
fun main() {
val firstBig = (1..1000000).asSequence()
.map { it * 2 }
.first { it > 10 }
println(firstBig)
}Промежуточные и конечные операции
Операции над последовательностями делятся на два вида:
- Промежуточные (
map,filter,take): ленивые, возвращают другую последовательность. - Конечные (
toList,sum,first): запускают вычисление и создают значение.
Без конечной операции ничего не происходит
Одна лишь промежуточная цепочка не выполняет код. Пока не вызвана конечная операция, лямбда-функции не выполняются.
fun main() {
val seq = listOf(1, 2, 3).asSequence()
.map { println("processing $it"); it }
println("Nothing printed yet")
seq.toList()
}Когда полезны последовательности
Последовательности особенно полезны для больших наборов данных, длинных цепочек операций или случаев, когда нужна только часть результата, например первое совпадение. Для небольших списков обычные коллекции проще и работают так же быстро.
Мысленная модель
Представьте, что коллекция обрабатывается в виде горизонтальных слоёв — все элементы проходят один шаг, — а последовательность в виде вертикальных потоков — один элемент проходит все шаги. Поэтому последовательности не создают промежуточные списки.
Быстрая проверка
Почему последовательности могут быть эффективнее коллекций?
Итоги
Последовательности обрабатывают данные лениво, по одному элементу, через цепочку промежуточных операций; вычисление запускается только конечной операцией. Это устраняет промежуточные списки и позволяет досрочно завершать обработку. Далее Вы научитесь создавать последовательности.
Часто задаваемые вопросы
Урок «Зачем нужны последовательности» бесплатный?
Да — полный текст урока «Зачем нужны последовательности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Зачем нужны последовательности»?
Отложенное вычисление Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Зачем нужны последовательности»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны последовательности
- Создание последовательностей
- Отложенные операции
- Последовательности и коллекции