Функция sequence

Функция sequence создает ленивую последовательность элементов, которая вычисляет элементы по мере необходимости. В отличие от обычных коллекций, последовательности не хранят все элементы в памяти сразу, что делает их эффективными для работы с большими наборами данных. Последовательности поддерживают те же операции, что и коллекции, но выполняют их лениво.

Импорт

kotlinimport kotlin.sequences.sequence

Синтаксис

kotlinfun <T> sequence(block: suspend SequenceScope<T>.() -> Unit): Sequence<T>
kotlinfun <T> sequence(vararg elements: T): Sequence<T>
kotlinfun <T> sequenceOf(vararg elements: T): Sequence<T>

Пример

Создание последовательности из нескольких элементов:

kotlinval seq: Sequence<Int> = sequenceOf(1, 2, 3, 4, 5)
val res: List<Int> = seq.toList()
println(res)

Результат выполнения кода:

kotlinList<Int> [1, 2, 3, 4, 5]

Пример

Создание последовательности с помощью функции sequence и ленивого генератора:

kotlinval seq: Sequence<Int> = sequence {
  yield(1)
  yieldAll(listOf(2, 3))
  yield(4)
  yield(5)
}

val res: List<Int> = seq.toList()
println(res)

Результат выполнения кода:

kotlinList<Int> [1, 2, 3, 4, 5]

Пример

Демонстрация ленивого выполнения операций с последовательностью:

kotlinval 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)

Результат выполнения кода:

kotlinSequence created
Mapping 1
Mapping 2
Mapping 3
List<Int> [2, 4, 6]

Пример

Создание бесконечной последовательности:

kotlinval infiniteSeq: Sequence<Int> = sequence {
  var i = 0
  while (true) {
    yield(i++)
  }
}

val res: List<Int> = infiniteSeq.take(5).toList()
println(res)

Результат выполнения кода:

kotlinList<Int> [0, 1, 2, 3, 4]

Пример

Сравнение производительности последовательностей и коллекций:

kotlinval 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")

Результат выполнения кода:

kotlinCollection result: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
Sequence result: [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]

Смотрите также

  • функцию transform,
    которая выполняет преобразования над коллекциями
  • функцию map,
    которая преобразует элементы коллекции
  • функцию filter,
    которая фильтрует элементы коллекции
  • функцию take,
    которая берет первые n элементов коллекции