Spec-Zone.ru › Kotlin 2

generateSequence

kotlin-stdlib/kotlin.sequences/generateSequence

Начиная с Kotlin: 1.0

fun <T : Any> generateSequence(nextFunction: () -> T?): Sequence<T>

Возвращает последовательность, которая при каждой итерации вызывает функцию для вычисления следующего значения, пока функция не вернёт null.

Возвращенную последовательность можно перебирать только один раз.

См. также

constrainOnce
sequence

Примеры

import kotlin.test.*

fun main() { 
   //sampleStart 
   var count = 3

val sequence = generateSequence {
    (count--).takeIf { it > 0 } // will return null, when value becomes non-positive,
                                // and that will terminate the sequence
}

println(sequence.toList()) // [3, 2, 1]

// sequence.forEach {  }  // <- iterating that sequence second time will fail 
   //sampleEnd
}

fun <T : Any> generateSequence(seed: T?, nextFunction: (T) -> T?): Sequence<T>

Возвращает последовательность, определяемую начальным значением seed и функцией nextFunction, которая вызывается при каждой итерации для вычисления следующего значения на основе предыдущего.

Последовательность генерирует значения, пока не встретит первое значение null. Если seed равно null, создаётся пустая последовательность.

Последовательность можно перебирать несколько раз, каждый раз начиная с seed.

См. также

sequence

Примеры

import kotlin.test.*

fun main() { 
   //sampleStart 
   fun fibonacci(): Sequence<Int> {
    // fibonacci terms
    // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...
    return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first }
}

println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 
   //sampleEnd
}

fun <T : Any> generateSequence(seedFunction: () -> T?, nextFunction: (T) -> T?): Sequence<T>

Возвращает последовательность, определяемую функцией seedFunction, которая вызывается для создания начального значения, и функцией nextFunction, которая вызывается при каждой итерации для вычисления следующего значения на основе предыдущего.

Последовательность генерирует значения, пока не встретит первое значение null. Если seedFunction возвращает null, создаётся пустая последовательность.

Последовательность можно перебирать несколько раз.

См. также

sequence

Примеры

import kotlin.test.*

fun main() { 
   //sampleStart 
   class LinkedValue<T>(val value: T, val next: LinkedValue<T>? = null)

fun <T> LinkedValue<T>?.asSequence(): Sequence<LinkedValue<T>> = generateSequence(
    seedFunction = { this },
    nextFunction = { it.next }
)

fun <T> LinkedValue<T>?.valueSequence(): Sequence<T> = asSequence().map { it.value }

val singleItem = LinkedValue(42)
val twoItems = LinkedValue(24, singleItem)

println(twoItems.valueSequence().toList()) // [24, 42]
println(singleItem.valueSequence().toList()) // [42]
println(singleItem.next.valueSequence().toList()) // [] 
   //sampleEnd
}

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.sequences/generate-sequence.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API