Diferença entre FlatMap, SwitchMap e ConcatMap RxJava.

Roque Buarque
Android Dev BR
Published in
4 min readJan 29, 2021

Vamos jogar um joguinho para fixar de uma vez por todas a diferença entre esses operadores do RxJava?

Leque de opções

RxJava é uma biblioteca muito robusta e já está no mercado a alguns anos, se você utiliza rx em seu dia a dia para desenvolver um código reativo, provavelmente já deve ter parado pra conferir qual a diferença de alguns operadores, pois são muitas opções, certo?

Qual operador usar?

Já se perguntou isso durante o desenvolvimento utilizando rxJava? Geralmente o que você faz após essa pergunta aparecer? Eu costumo ir para a documentação, mas confesso que muitas das vezes ainda continuo com a dúvida. O que me ajuda muito a entender a diferença entre os operadores são os famosos Marbles Graphs, e aqui vai um site bacana pra você. Vamos dar uma olhada então nos graphs desses 3 operadores, flatMap, switchMap e concatMap.

FlatMap

As primeiras impressões que temos ao olhar para o diagrama acima é que o flatMap vai receber um círculo e transformar em dois losangos, certo? Também da para notar que a ordem dos losangos não é a mesma ordem de entrada dos círculos.

ConcatMap

Diferente do flatMap, percebemos no diagrama do concatMap que temos de entrada um círculo, ocorre uma transformação convertendo o círculo em um losango e uma emissão de mais um losango, mantendo a ordem de todas as emissões.

SwitchMap

Eita, agora complicou hein! Vamos ler esse diagrama juntos, primeira emissão temos um círculo vermelho, ao aplicar o switchMap temos a transformação desse círculo vermelho para um losango junto com um quadrado também vermelho. Porém ao tentar fazer o mesmo com o círculo verde a emissão do quadrado verde foi interrompida devido a uma nova emissão do círculo azul.

Um pouco mais complicado de entender, certo? Muitas vezes quando eu ainda tenho dúvidas mesmo depois de ler a documentação e ver os marbles diagrams, só me resta colocar a mão na massa e ver com meus próprios olhos os outputs desses operadores, o famoso só acredito vendo.

Vamos jogar?

Aposto que após esse jogo você vai fixar de vez a diferença entre esses operadores, chega de falar em teoria e vamos ver um pouco de código.

FlatMap testando o output

Qual o output do código acima utilizando o flatMap?

A- [50]

B- [50, 20, 10, 30, 40]

C- [10, 20, 30, 40, 50]

Resposta

Se você falou que a opção B você ACERTOU! Conforme a documentação diz o flatMap não mantém a ordem dos itens emitidos, como a segunda stream de observables houve um delay, o flatMap não manteve a ordem dos itens enviados na primeira emissão.

ConcatMap testando o output

Qual o output do código acima utilizando o concatMap?

A- [10, 20, 30, 40, 50]

B- [50]

C- [50, 20, 10, 30, 40]

Resposta

Se você falou que a opção A você ACERTOU! Conforme a documentação diz o concatMap mantém a ordem dos itens emitidos.

SwitchMap testando o output

Qual o output do código acima utilizando o switchMap?

A- [10, 20, 30, 40, 50]

B- [50, 20, 10, 30, 40]

C- [50]

Resposta

Se você falou que a opção C você ACERTOU! Conforme a documentação diz o switchMap para de subscrever a primeira stream ignorando os próximos itens emitidos até que a segunda stream emita algo. Nesse caso como a segunda stream de observable houve um delay, os items enviados pela primeira stream foram ignorados, fazendo assim o switchMap pegar somente o último item emitido pelo source de observables acima.

Conclusão

FlatMap -> Emite todos os items porém não se importa com a ordem

ConcatMap -> Emite todos os items na ordem original emitida pelo observable source.

SwitchMap -> Para de subscrever ao source de observable ou seja o observable que aplicou o switchMap até que a segunda stream de observable emita algo.

Valeu por de lido meu artigo, se curtiu não esqueça de deixar uns claps para incentivar quem ta produzindo conteúdo, um abraço e até a próxima.

--

--