RxJava: Operadores — Parte 2

Edilson Ngulele
GDG Maputo
Published in
4 min readApr 3, 2018

Existem vários operadores RxJava, alguns deles são difíceis/complicados de usar e outros nem tanto. Eles desempenham um grande papel pois é graças a eles que nós podemos criar, filtrar, transformar e executar várias operações com os nossos Observables.

No artigo anterior, eu expliquei como podemos criar Observables e emitir dados. Vimos também dois tipos de operadores: Criação e Transformação de Observable. Se ainda não tiveste a oportunidade de ler esse artigo, podes fazer aqui.

Este é o terceiro artigo da série e venho dar continuidade ao artigo anterior. Neste artigo veremos mais dois tipos de operadores: Filtragem e Combinação de Observable.

Operadores de filtragem

Operadores de filtragem servem para emitir dados seletivamente a partir de uma fonte (Observable). Permite-nos filtrar fluxos de dados baseados em uma expressão e emite dados que satisfazem a essa expressão.

1. Filter()

fonte: http://reactivex.io/documentation/operators/filter.html

Este é o operador de filtragem mais usado. Ele emite dados de acordo com a expressão que ele carrega. Por exemplo:

Temos um Observable com uma sequência numérica: 2 30 22 5 60 1. O operador filter() emite apenas os número maiores que 10, de acordo com expressão x -> x > 10. Portanto, o output será: 30 22 60.

2. Skip()

fonte: http://reactivex.io/documentation/operators/skip.html

O skip() ignora os primeiros n itens do Observable e apenas emite os itens seguintes. Por exemplo:

Assim como no exemplo anterior, este Observable emite uma sequencia numérica: 1 2 3 4. Usando o operador skip(), nós podemos definir de onde queremos comecar a emitir os itens. Neste caso, o nosso Observable irá saltar (como já diz o nome do operador, skip) os dois primeiros itens e só depois disso que irá realizar a sua primeira emissão. Asim sendo, o output será: 3 4.

Bonus: Distinct()

fonte: http://reactivex.io/documentation/operators/distinct.html

Este operador filtra o Observable, permitindo apenas itens que ainda não foram emitidos. Por exemplo:

Como podes ver, o Observable emite os números 1 1 2 1 3, onde o número 1 esta repetido. Graças ao operador distinct() nós podemos filtrar e emitir apenas os números sem repetição. Então, o output será: 1 2 3.

Operadores de combinação

Basicamente, são operadores que trabalham com vários Observables de modo a criar um único Observable.

1. Merge()

fonte: http://reactivex.io/documentation/operators/merge.html

O merge() combina vários Observables em um. Isto é, ele leva o output/itens de vários Observables e junta todos eles de forma a criar um unico Observable com um único fluxo de dados. Podemos ver no exemplo abaixo:

Temos dois Observables, set1 &set2. Cada um deles possui o seu fluxo de dados, de seguida, com a ajuda do operador merge(), criamos um novo Observable que irá emitir os dados dos Observables set1 &set2 num só fluxo.

Então, consegues prever qual será o output? Veja por si mesmo:

MozDevz
Muthiana Code
GDG Maputo
Women Techmakers

2. Zip()

O zip() leva duas ou mais sequências e as combina uma por uma através do índice. Ora vejamos:

Teremos com output:

MozDevz -  GDG Maputo
Muthiana Code - Women Techmakers

Nota que nem todos os dados do Observable set1 foram adicionados ao nosso novo Observable, como é o caso do JavaEE do set1. Por que será?…. Simples!

Como havia dito anteriormente, o zip() combina as sequências que ele recebe através do índice. Isto é, ele pega o item do primeiro índice no set1 e combina com o item do primeiro índice no set2. De seguida, pega no item do segundo índice no set1 e combina com o item do segundo índice do set2. Ao chegar no terceiro e último item do set1, o zip() reparar que o set2 não tem mais itens por combinar, então a operação termina aí e são apenas emitidos os itens que foram combinados.

fonte: https://giphy.com

É isso!

Chegamos ao fim de mais um artigo, espero que tenha sido útil para ti. O RxJava possui uma vasta lista de operadores, apenas expliquei alguns que fazem parte do grupo dos operadores mais populares, que na verdade representam uma fração deles

No próximo artigo vamos colocar a mão na massa e iremos aplicar todo conteúdo visto até agora em um projeto real.

Se tiver alguma questão ou sugestão deixe aí nos comentários e não hesite em contactar-me pelo email: edilsonngulele@gmail.com ou twitter: @edilson_ngulele.

Obrigado e até a próxima!

--

--

Edilson Ngulele
GDG Maputo

Just a regular guy who loves coding and writing about Google Technologies | Project Manager @ MozDevz