Groo

flatMapConcat을 활용하여 Flow를 다른 Flow로 변환 본문

프로그래밍 언어/Kotlin

flatMapConcat을 활용하여 Flow를 다른 Flow로 변환

김주엽 2022. 4. 16. 21:08

아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.

그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: Kt World)


Flow는 여러 Flow를 합쳐 하나의 Flow로 변환할 수 있도록 돕는 Flattening Operator를 제공한다.

flatMapConcat은 Flattening Operator의 대표적인 연산자 중 하나이며 여러 Flow를 연결한다.

@FlowPreview
public fun <T, R> Flow<T>.flatMapConcat(transform: suspend (value: T) -> Flow<R>): Flow<R> =
    map(transform).flattenConcat()

flatMapConcat은 내부에서 아래 두 가지 과정을 통해 여러 Flow를 하나로 합친다.

  • transform 변수에 대한 map을 수행해, 원 Flow에서 발행된 데이터를 가지고 새로운 Flow를 만든다.
    • 이 과정에서 원 Flow에서 발행되는 데이터의 수에 따라 여러 개의 Flow가 만들어질 수 있다.
  • 이렇게 생성된 여러 개의 Flow들이 flattenConcat을 통해 하나의 Flow로 합쳐진다.
val stockFlow = flow {
    emit(66600) // 삼성전자
    emit(95400) // 카카오
    emit(308500) // 네이버
}

@FlowPreview
fun increaseStock() {
    lifecycleScope.launch {
        stockFlow.flatMapConcat { value ->
            flow {
                emit(value * 2)
            }
        }.collect {
            println("증폭된 주식 가격: $it")
        }
    }
}

// 증폭된 주식 가격: 133200
// 증폭된 주식 가격: 190800
// 증폭된 주식 가격: 617000

그러나 flatMapConcat은 원 Flow에서 발행된 데이터를 순차적으로 처리하는 구조이므로 새로운 Flow를 만드는 과정에서 시간이 오래 소요된다면 데이터의 최초 발행 시점과 소비자의 데이터 소비 시점에서 많은 시간 차이가 발생할 수 있는 한계점이 있다.

 

stockFlow.flatMapConcat { value ->
    flow {
        delay(10000) // 주식 서버 접속 시간
        emit(value * 2)
    }
}.collect {
    println("증폭된 주식 가격: $it")
}

// wait 10sec
// 증폭된 주식 가격: 133200
// wait 10sec
// 증폭된 주식 가격: 190800
// wait 10sec
// 증폭된 주식 가격: 617000

flatMapConcat을 활용하여 여러 Flow를 하나의 Flow로 합치는 방법에 대해서 알아봤다.

실제 서비스 개발에서도 유용할만한 연산자인 것 같다.

힘들고 지쳐도 항상 버티고 더 노력하자 🍀

Comments