[Coroutine] 시퀀스/이터레이터
업데이트:
일시 중단 가능한 시퀀스 및 이터레이터
일시 중단 가능한 시퀀스 및 이터레이터는 다음과 같은 특징을 가지고 있다.
- 호출 사이에서 일시 중단되지만, 실행 중에는 일시 중단될 수 없다.
- 시퀀스와 이터레이터 빌더는 CoroutineContext 를 받지 않는다. 기본적으로 코드를 호출한 컨텍스트와 동일한 컨텍스트에서 코드가 실행됨을 의미한다.
- 정보 산출후에만 일시 중지할 수 있다. 이를 위해서는 yeild() 또는 yieldAll() 함수를 호출해야 한다.
이터레이터
이터레이터의 간단한 예는 다음과 같다.
fun main() {
val iterator = iterator {
yield("First")
yield("Second")
yield("Third")
}
println(iterator.next())
println(iterator.next())
println(iterator.next())
}
예제에서 이터레이터는 값이 생성된 후 총 세 번 일시 중단된다.
코틀린 이터레이터의 특성은 다음과 같다.
- 인덱스로 요소를 검색할 수 없고 순서대로만 엑세스 가능하다.
- 더 많은 요소가 있는지 여부를 나타내는 hasNext() 함수가 있다.
- 이전 요서를 검색할 방법은 없다.
- 재설정(reset) 할 수 없으므로 한 번만 반복할 수 있다.
시퀀스
일시 중단 시퀀스의 몇 가지 특성은 아래와 같다.
- 인덱스로 값을 가져올수 있다.
- 상태가 저장되지 않으며(stateless), 상호 작용 후 자동으로 재설정(reset) 된다.
일시 중단 시퀀스를 만들기 위해 sequence() 빌더를 사용한다.
val sequence = sequence {
yield(1)
}
특정 요소 얻기
- elementAt(index) : 해당 위치의 요소를 반환한다.
- elementAtOrElse(index, {lamda}) : 해당 위치에 요소가 없으면 람다식의 결과물을 반환한다.
- elementAtOrNull(index, {lamda}) : 해당 위치에 요소가 없으면 Null을 반환한다.
Reference
코틀린 동시성 프로그래밍(에이콘)
댓글남기기