generateSequence
fun <T : Any> generateSequence( nextFunction: () -> T? ): Sequence<T>
Возвращает последовательность, которая вызывает функцию для вычисления следующего значения на каждой итерации, пока функция не вернёт null.
Возвращаемая последовательность ограничена однократным итеративным проходом.
import kotlin.test.*
fun main(args: Array<String>) {
//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.
import kotlin.test.*
fun main(args: Array<String>) {
//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, генерируется пустая последовательность.
Последовательность может быть итерирована многократно.
import kotlin.test.*
fun main(args: Array<String>) {
//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–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/generate-sequence.html