Функция sequence
Функция sequence создает ленивую последовательность элементов,
которая вычисляет элементы по мере необходимости. В отличие от обычных
коллекций, последовательности не хранят все элементы в памяти сразу,
что делает их эффективными для работы с большими наборами данных.
Последовательности поддерживают те же операции, что и коллекции,
но выполняют их лениво.
Импорт
import kotlin.sequences.sequence
Синтаксис
fun <T> sequence(block: suspend SequenceScope<T>.() -> Unit): Sequence<T>
fun <T> sequence(vararg elements: T): Sequence<T>
fun <T> sequenceOf(vararg elements: T): Sequence<T>
Пример
Создание последовательности из нескольких элементов:
val seq: Sequence<Int> = sequenceOf(1, 2, 3, 4, 5)
val res: List<Int> = seq.toList()
println(res)
Результат выполнения кода:
List<Int> [1, 2, 3, 4, 5]
Пример
Создание последовательности с помощью функции sequence
и ленивого генератора:
val seq: Sequence<Int> = sequence {
yield(1)
yieldAll(listOf(2, 3))
yield(4)
yield(5)
}
val res: List<Int> = seq.toList()
println(res)
Результат выполнения кода:
List<Int> [1, 2, 3, 4, 5]
Пример
Демонстрация ленивого выполнения операций с последовательностью:
val seq: Sequence<Int> = sequenceOf(1, 2, 3, 4, 5)
.map {
println("Mapping $it")
it * 2
}
.take(3)
println("Sequence created")
val res: List<Int> = seq.toList()
println(res)
Результат выполнения кода:
Sequence created
Mapping 1
Mapping 2
Mapping 3
List<Int> [2, 4, 6]
Пример
Создание бесконечной последовательности:
val infiniteSeq: Sequence<Int> = sequence {
var i = 0
while (true) {
yield(i++)
}
}
val res: List<Int> = infiniteSeq.take(5).toList()
println(res)
Результат выполнения кода:
List<Int> [0, 1, 2, 3, 4]
Пример
Сравнение производительности последовательностей и коллекций:
val numbers = 1..1000000
// Коллекция - все промежуточные коллекции создаются сразу
val collectionResult = numbers
.filter { it % 2 == 0 }
.map { it * 2 }
.take(10)
.toList()
// Последовательность - промежуточные операции выполняются лениво
val sequenceResult = numbers.asSequence()
.filter { it % 2 == 0 }
.map { it * 2 }
.take(10)
.toList()
println("Collection result: $collectionResult")
println("Sequence result: $sequenceResult")
Результат выполнения кода:
Collection result: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
Sequence result: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]