중간 리스트를 생성하지 않고 리스트 스트림 연산을 수행할 수 있다.
termination operation이 호출될때 연산이 수행된다.
generateSequence(seed: T?, nextFunction: () -> T?)
seed
로 받아진 값을 첫 원소로 생성한다.
lamda로 정의된 nextFunction
에 따라 무한히 반복하여 원소를 생성하며, nextFunction
이 null을 반환할때 종료된다.
take()
함수를 통해 원하는 지점까지의 값을 취해 sequence를 만들 수 있다.
Sequence<T>.drop(*n*: Int): Sequence<T>
Returns a sequence containing all elements except first n elements.
The operation is intermediate and stateless.
val primes: Sequence<Int> = sequence {
var numbers = generateSequence(2) { it + 1 }
while (true) {
val prime = numbers.first()
yield(prime)
numbers = numbers.drop(1)
.filter { it % prime != 0 }
}
}
print(primes.take(10).toList())
https://medium.com/@mook2_y2/코틀린-입문-스터디-15-sequences-52cfca1805c8