지연 평가 Sequence의 원리
fun main() {
val primes: Sequence<Int> = sequence {
var numbers = generateSequence(2) { it + 1 } // <- 최초 1 번만 실행
while (true) { // <- 이후 item 요청에 대해서는 계속 이 안에서 돈다.
val prime = numbers.first()
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
}
}
println(primes.take(10).toList())
}
- sequence는 filter(Predicate)를 가지고 있음!
- 등록한 모든 Predicate 들을 기억해 두었다가
다음번 item 반환 요청이 오면 filter들을 모두 적용해서 결과를 산출한다.
- $prime=2인 predicate는 2의 배수 탈락 filter
- $prime=3인 predicate는 3의 배수 탈락 filter
mutable 변수의 Capture로 인한 문제
fun main() {
val primes: Sequence<Int> = sequence {
var numbers = generateSequence(2) { it + 1 }
var prime: Int
while (true) {
prime = numbers.first()
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
/* 위 람다에서 var prime을 capture하여 참조하므로
capture 시점의 prime 값이 아니라 실행 시점의 prime이 적용된다 */
}
}
println(primes.take(10).toList())
}
- mutable 변수의 단점이란, 해당 변수 사용하고 있는 로직 변경 어려움, 추적 어려움, 이 처럼 예상치 못한 문제 발생 할 수 있음.
'Java Stack > Kotlin' 카테고리의 다른 글
[Kotlin] as와 타입 캐스팅. 런타임 에러. 타입 파라미터 소거(erasure) (0) | 2023.08.13 |
---|---|
[Kotlin] Kotlin Coroutines (with Spring WebFlux) (0) | 2021.08.29 |
[Kotlin] java의 static final 변수에 대응되는 것은? (0) | 2021.02.11 |
[Kotlin] Serialization: Gson, Jackson (0) | 2020.03.19 |
[Kotlin] 제네릭 : 변성(variance), 타입 프로젝션(type projection) (1) | 2017.12.08 |