코틀린의 시퀀스는 List
나 Set
같은 컬렉션이랑 비슷함 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연(lazy)처리를 함. 시퀀스의 특징은 다음과 같음.
이러한 특징 때문에 값을 순차적으로 계산하여 필요할 때 반환하는 빌더를 정의하는 것이 좋음.
public fun <T> sequence(@BuilderInference block: suspend SequenceScope<T>.() -> Unit): Sequence<T> = Sequence { iterator(block) }
SequenceScope
를 람다로 가지며, 시퀀스를 리턴함.
iterator
로 람다를 실행.SequenceScope
는 Sequence 또는 Iterator의 값을 산출하는 범위는 yield 및 yieldAll 일시 중단 함수를 제공함.yield
는 빌드 중인 Iterator
에 값을 제공하고 다음 값이 요청될 때까지 일시 중단함.fun main() {
val sequence = sequence {
println("Generating first")
yield(1)
println("Generating second")
yield(2)
println("Generating third")
yield(3)
println("Done")
}
for (num in sequence) {
println("The next number is $num")
}
}
yield
외 다른 일시중단 함수를 사용하면 안됨.
SequenceScope
에 @RestrictsSuspension
어노테이션이 있기 때문임.
SequenceScope
가 아닐 경우에 일시중단 함수를 호출하는 것을 허용하지 않음.yield
를 호출했던 지점에서 다시 실행됨.