Groo
flatMapConcat을 활용하여 Flow를 다른 Flow로 변환 본문
반응형
아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.
그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: 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로 합치는 방법에 대해서 알아봤다.
실제 서비스 개발에서도 유용할만한 연산자인 것 같다.
힘들고 지쳐도 항상 버티고 더 노력하자 🍀
반응형
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
flatMapMerge를 활용하여 Flow 변환 병렬 처리 (0) | 2022.04.17 |
---|---|
flatMapLatest를 활용하여 flatMapConcat의 한계 극복 (0) | 2022.04.17 |
conflate를 활용하여 최신 데이터 collect (0) | 2022.04.03 |
collect와 collectLatest의 차이 (0) | 2022.04.03 |
buffer를 활용하여 발행자와 소비자의 Coroutine 분리 (0) | 2022.04.02 |
Comments