sequence
Builds a Sequence lazily yielding values one by one.
If the consuming code stops iterating the sequence before it's completed, the remainder of the computation will not run at all. In particular, it means that finally blocks may be left unexecuted:
val sequenceOfOne = sequence {
try {
yield(1)
// no code after the `yield(1)` line will be executed!
} finally {
println("This line will not run")
}
}
// only get the first element, do not attempt evaluating the rest of them
println(sequenceOfOne.first())Content copied to clipboard
Since Kotlin
1.3See also
Samples
import kotlin.test.*
fun main() {
//sampleStart
val sequence = sequence {
val start = 0
// yielding a single value
yield(start)
// yielding an iterable
yieldAll(1..5 step 2)
// yielding an infinite sequence
yieldAll(generateSequence(8) { it * 3 })
}
println(sequence.take(7).toList()) // [0, 1, 3, 5, 8, 24, 72]
//sampleEnd
}import kotlin.test.*
fun main() {
//sampleStart
fun fibonacci() = sequence {
var terms = Pair(0, 1)
// this sequence is infinite
while (true) {
yield(terms.first)
terms = Pair(terms.second, terms.first + terms.second)
}
}
println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
//sampleEnd
}