[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

코틀린 동시성 프로그래밍(에이콘)

댓글남기기