Combinando observáveis no RxJava
1. Introdução
Neste tutorial rápido, discutiremos diferentes maneiras de combinarObservables em RxJava.
Se você é novo no RxJava, confira esteintro tutorial primeiro.
Agora, vamos começar.
2. Observables
SequênciasObservable, ou simplesmenteObservables, são representações de fluxos de dados assíncronos.
Eles são baseados emObserver pattern em que um objeto chamadoObserver, se inscreve em itens emitidos por umObservable.
A assinatura não é bloqueadora, poisObserver deve reagir a qualquer coisa queObservable irá emitir no futuro. Isso, por sua vez, facilita a simultaneidade.
Aqui está uma demonstração simples em RxJava:
Observable
.from(new String[] { "John", "Doe" })
.subscribe(name -> System.out.println("Hello " + name))
3. Combinando Observáveis
Ao programar usando uma estrutura reativa, é um caso de uso comum combinar váriosObservables.
Em um aplicativo Web, por exemplo, podemos precisar obter dois conjuntos de fluxos de dados assíncronos que são independentes um do outro.
Em vez de esperar que o fluxo anterior seja concluído antes de solicitar o próximo fluxo, podemos chamar ambos ao mesmo tempo e assinar os fluxos combinados.
Nesta seção, discutiremos algumas das diferentes maneiras de combinar váriosObservables em RxJava e os diferentes casos de uso aos quais cada método se aplica.
3.1. Merge
Podemos usar o operadormerge para combinar a saída de váriosObservables para que funcionem como um:
@Test
public void givenTwoObservables_whenMerged_shouldEmitCombinedResults() {
TestSubscriber testSubscriber = new TestSubscriber<>();
Observable.merge(
Observable.from(new String[] {"Hello", "World"}),
Observable.from(new String[] {"I love", "RxJava"})
).subscribe(testSubscriber);
testSubscriber.assertValues("Hello", "World", "I love", "RxJava");
}
3.2. MergeDelayError
O métodomergeDelayError é o mesmo quemerge porque combina váriosObservables em um, masif errors occur during the merge, it allows error-free items to continue before propagating the errors:
@Test
public void givenMutipleObservablesOneThrows_whenMerged_thenCombineBeforePropagatingError() {
TestSubscriber testSubscriber = new TestSubscriber<>();
Observable.mergeDelayError(
Observable.from(new String[] { "hello", "world" }),
Observable.error(new RuntimeException("Some exception")),
Observable.from(new String[] { "rxjava" })
).subscribe(testSubscriber);
testSubscriber.assertValues("hello", "world", "rxjava");
testSubscriber.assertError(RuntimeException.class);
}
O exemplo acimaemits all the error-free values:
hello
world
rxjava
Observe que se usarmosmerge em vez demergeDelayError, oString “rxjava” não será emitido porquemerge interrompe imediatamente o fluxo de dados deObservables quando ocorre um erro.
3.3. Zip
O método de extensãozipbrings together two sequences of values as pairs:
@Test
public void givenTwoObservables_whenZipped_thenReturnCombinedResults() {
List zippedStrings = new ArrayList<>();
Observable.zip(
Observable.from(new String[] { "Simple", "Moderate", "Complex" }),
Observable.from(new String[] { "Solutions", "Success", "Hierarchy"}),
(str1, str2) -> str1 + " " + str2).subscribe(zippedStrings::add);
assertThat(zippedStrings).isNotEmpty();
assertThat(zippedStrings.size()).isEqualTo(3);
assertThat(zippedStrings).contains("Simple Solutions", "Moderate Success", "Complex Hierarchy");
}
3.4. Zip com intervalo
Neste exemplo, vamos zipar um stream cominterval que, na verdade, atrasará a emissão de elementos do primeiro stream:
@Test
public void givenAStream_whenZippedWithInterval_shouldDelayStreamEmmission() {
TestSubscriber testSubscriber = new TestSubscriber<>();
Observable data = Observable.just("one", "two", "three", "four", "five");
Observable interval = Observable.interval(1L, TimeUnit.SECONDS);
Observable
.zip(data, interval, (strData, tick) -> String.format("[%d]=%s", tick, strData))
.toBlocking().subscribe(testSubscriber);
testSubscriber.assertCompleted();
testSubscriber.assertValueCount(5);
testSubscriber.assertValues("[0]=one", "[1]=two", "[2]=three", "[3]=four", "[4]=five");
}
4. Sumário
Neste artigo, vimos alguns dos métodos para combinarObservables com RxJava. Você pode aprender sobre outros métodos comocombineLatest,join,groupJoin,switchOnNext, noofficial RxJava documentation.
Como sempre, o código-fonte deste artigo está disponível em nossoGitHub repo.