Diferença entre FlatMap, SwitchMap e ConcatMap RxJava.
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.