RxJavaでの観測量の組み合わせ

1前書き

このクイックチュートリアルでは、RxJavaで Observables を組み合わせるさまざまな方法について説明します。

RxJavaを初めて使用する場合は、必ず次のリンクを確認してください。/rxjava-tutorial[はじめにチュートリアル]。

それでは、すぐに始めましょう。

2 観測値

Observable シーケンス、または単に Observables は、非同期データストリームの表現です。

これらはhttps://en.wikipedia.org/wiki/Observer pattern[Observerパターン]に基づいています。ここで、 Observer というオブジェクトは、 Observable__によって発行されたアイテムを購読します。

Observer は、 Observable が将来放出するものすべてに反応することを意味しているため、サブスクリプションは非ブロッキングです。これにより、並行性が促進されます。

これがRxJavaでの簡単なデモです。

Observable
  .from(new String[]{ "John", "Doe" })
  .subscribe(name -> System.out.println("Hello " + name))

3観測量の組み合わせ

リアクティブフレームワークを使用してプログラミングする場合、さまざまな オブザーバブル を組み合わせるのが一般的なユースケースです。

たとえば、Webアプリケーションでは、互いに独立した2組の非同期データストリームを取得する必要があります。

次のストリームを要求する前に前のストリームが完了するのを待つ代わりに、同時に両方を呼び出して結合されたストリームを購読することができます。

このセクションでは、RxJavaで複数の Observables を組み合わせることができるさまざまな方法と、各方法が適用されるさまざまなユースケースについて説明します。

3.1. マージ

merge 演算子を使用して、複数の Observables の出力を組み合わせて、それらが1つのように動作するようにすることができます。

@Test
public void givenTwoObservables__whenMerged__shouldEmitCombinedResults() {
    TestSubscriber<String> 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

mergeDelayError メソッドは、複数の Observables を1つに結合するという点で merge と同じです。

@Test
public void givenMutipleObservablesOneThrows__whenMerged__thenCombineBeforePropagatingError() {
    TestSubscriber<String> 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);
}

上記の例は、エラーのないすべての値を出力します。

hello
world
rxjava
  • mergeDelayError の代わりに merge を使用した場合、 merge はエラーが発生したときに Observables からのデータの流れを直ちに停止するので、 String “ __rxjava”は生成されません。

3.3. Zip

zip 拡張メソッドは、2つの値のシーケンスをペアとしてまとめたものです。

@Test
public void givenTwoObservables__whenZipped__thenReturnCombinedResults() {
    List<String> 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

この例では、 interval でストリームを圧縮します。これにより、最初のストリームの要素の発行が遅れることになります。

@Test
public void givenAStream__whenZippedWithInterval__shouldDelayStreamEmmission() {
    TestSubscriber<String> testSubscriber = new TestSubscriber<>();

    Observable<String> data = Observable.just("one", "two", "three", "four", "five");
    Observable<Long> 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概要

この記事では、 Observables とRxJavaを組み合わせるためのいくつかの方法について説明しました。 combineLatest join http:/のような他のメソッドについて学ぶことができます。 groupJoin switchOnNext /wiki/Combining-Observables[公式RxJavaドキュメント]。

いつものように、この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/rxjava[GitHubリポジトリ]にあります。

前の投稿:WebSocket用Java APIガイド
次の投稿:リストをJavaの別のリストにコピーする