본문 바로가기

gyub's 공부일기/RxJava

[RxJava] 변환 연산자 concatMap(), switchMap(), groupBy(), scan()

1. 변환 연산자

변환 연산자는 데이터 흐름을 원하는 대로 변형할 수 있는 연산자입니다.

이번 글에서는 flatMap()과 동일한 계열인 concatMap()과 switchMap() 함수, reduce() 함수와 유사한 scan()함수, 색다른 groupBy() 함수를 다뤄보겠습니다.

 

2. concatMap() 함수

concatMap() 함수는 flatMap() 함수와 비슷합니다. flatMap()는 먼저 들어온 데이터를 처리하는 도중에 새로운 데이터가 들어오면 나중에 들어온 데이터의 처리 결과가 먼저 출력 될 수도 있습니다. 이것을 인터리빙(=끼어들기, interleaving)이라고 합니다.

 

이와 반대로 concatMap() 함수는 먼저 들어오는 데이터 순서대로 처리해서 결과를 낼 수 있도록 보장해줍니다.

 

flatMap과 concatMap을 마블 다이어그램으로 비교를 해볼게요.

flatMap()

 

concatMap()

flatMap() 같은 경우 초록색 마름모로 출력이 완료되기 전 파란색 원이 발행되므로 중간에 파란색 마름모가 출력이 됩니다.

하지만 concatMap()의 경우에는 중간에 파란색 원이 발행되어도 초록색 마름모의 출력이 완료될 때까지 잠시 머무르게 되죠.

 

3. switchMap()

concatMap() 함수가 인터리빙이 발생할 수 있는 상황에서 동작의 순서를 보장해준다면 switchMap()함수는 순서를 보장하기 위해 기존에 진행 중이던 작업을 바로 중단합니다. 그리고 여러 개의 값이 발행되었을 때 마지막에 들어온 값만 처리하고 싶을 때 사용합니다. 중간에 끊기더라도 마지막 데이터의 처리는 보장하기 때문이죠.

 

 

4. groupBy()

groupBy() 함수는 어떤 기준(keySelector)으로 단일 Observable을 여러 개로 이루어진 Observable 그룹(GroupedObservable)으로 만듭니다. 

5. scan()

scan() 함수는 3장에서 배운 reduce() 함수와 비슷합니다. reduce() 함수는 Observable에서 모든 데이터가 입력된 후 그것을 종합하여 마지막 1개의 데이터만을 구독자에게 발행했습니다. 반면 scan() 함수는 실행할 때마다 입력값에 맞는 중간 결과 및 최종 결과를 구독자에게 발행합니다.

 

reduce()와 scan()을 마블 다이어그램을 통해 비교해보겠습니다.

reduce()
scan()

 

반응형