RxJavaコンプリートテーブルの組み合わせ

1概要

このチュートリアルでは、https://www.baeldung.com/rx-java Completable typeを使用します。これは、実際の値なしの計算結果を表します。

2 RxJavaの依存関係

RxJava 2の依存関係をMavenプロジェクトに含めましょう。

<dependency>
    <groupId>io.reactivex.rxjava2</groupId>
    <artifactId>rxjava</artifactId>
    <version>2.2.2</version>
</dependency>

通常、https://search.maven.org/classic/#search%7C1%7Cg%3A%22io.reactivex.rxjava2%22%20AND%20a%3A%22rxjava%22[Mavenに最新バージョンがあります。中央]。

** 3補完タイプ

次に、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/observers/DisposableCompletableObserver.html[ DisposableCompletableObserver ]を使用して、その状態を確認できます。

Completable
  .complete()
  .subscribe(new DisposableCompletableObserver() {
    @Override
    public void onComplete() {
        System.out.println("Completed!");
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }
});
  • さらに、 Callable、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/functions/Action.html[Action]、およびRunnable :から Completable インスタンスを構築できます。

Completable.fromRunnable(() -> {});

また、 Completable.from() を使用するか、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Maybe.html#ignoreElementで ignoreElement()を呼び出すことで、他の型から Completable__インスタンスを取得できます。 - [多分]、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Single.html#ignoreElement--[シングル]、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#ignoreElements--[Flowable]、およびhttp://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#ignoreElements--[Observable]のソース彼ら自身:

Flowable<String> flowable = Flowable
  .just("request received", "user logged in");
Completable flowableCompletable = Completable
  .fromPublisher(flowable);
Completable singleCompletable = Single.just(1)
  .ignoreElement();

** 4連鎖 補完

実際の使用例では、操作の成功を気にするだけの場合、 Completables の連鎖を使用できます。

リモートを更新するためにPUTリクエストを実行するような** オールオアナッシングアクション

成功した場合はローカルデータベースの更新が続くオブジェクト ** 事後ログおよびジャーナリング

  • いくつかの行動のオーケストレーション、例えば後に分析ジョブを実行する

取り込みアクションが完了しました

例は単純かつ問題にとらわれないようにします。いくつかの Completable インスタンスがあるとします。

Completable first = Completable
  .fromSingle(Single.just(1));
Completable second = Completable
  .fromRunnable(() -> {});
Throwable throwable = new RuntimeException();
Completable error = Single.error(throwable)
  .ignoreElement();
  • 2つの Completables を1つにまとめるには、 httpを使用できます。 ) 演算子** :

first
  .andThen(second)
  .test()
  .assertComplete();

必要に応じて Completables を連鎖させることができます。同時に、少なくとも1つのソースが完了できなかった場合、結果として Completable onComplete() を起動しません**

first
  .andThen(second)
  .andThen(error)
  .test()
  .assertError(throwable);

さらに、** ソースの1つが無限大であるか、何らかの理由で ComComplete に達していない場合、結果の Completable onComplete() or__onError()も起動しません。

私たちがまだこのシナリオをテストできることは良いことです:

...
  .andThen(Completable.never())
  .test()
  .assertNotComplete();

5一連の補完テーブルを構成する

__Completablesがたくさんあることを想像してみてください。実際の使用例として、いくつかの別々のサブシステム内にユーザーを登録する必要があるとします。

  • すべての Completables を1つにまとめるには、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html#merge-java.lang.Iterable-[ merge ]( ) mege() 演算子はすべてのソースへの登録を許可します。

結果のインスタンスは、すべてのソースが完了すると完了します。さらに、いずれかのソースがエラーを出したときには onError で終了します。

Completable.mergeArray(first, second)
  .test()
  .assertComplete();

Completable.mergeArray(first, second, error)
  .test()
  .assertError(throwable);

少し異なるユースケースに移りましょう。 Flowable. から取得したすべての要素に対してアクションを実行する必要があるとしましょう。

それから、アップストリームの完了とすべての要素レベルのアクションの両方に対して単一の Completable が必要です。

flatMapCompletable ()演算子は、この場合に役立ちます。

Completable allElementsCompletable = Flowable
  .just("request received", "user logged in")
  .flatMapCompletable(message -> Completable
      .fromRunnable(() -> System.out.println(message))
  );
allElementsCompletable
  .test()
  .assertComplete();

同様に、上記のメソッドは、 Observable Maybe 、または Single. などの残りの基本リアクティブクラスにも使用できます。

flatMapCompletable() の実用的なコンテキストとして、すべての項目を何らかの副作用で装飾することを検討できます。完了した要素ごとにログエントリを書き込むか、または成功した各アクションごとにストレージスナップショットを作成できます。

最後に、** 他のいくつかのソースから Completable を作成し、それらのいずれかが完了したらすぐに終了させる必要があるかもしれません。

amb 接頭辞は「あいまいさ」の省略形です。これは、どの Completable が正確に完成するかについての不確実性を意味します。たとえば、 ambArray() : のようになります。

Completable.ambArray(first, Completable.never(), second)
  .test()
  .assertComplete();

上記の __Completable は、どのソースの補完可能文字が最初に終了するかによって、 onComplete() ではなく onError()__で終了することもあります。

Completable.ambArray(error, first, second)
  .test()
  .assertError(throwable);

また、最初のソースが終了すると、残りのソースは破棄されることが保証されます。

これは、実行中の残りの Completables がすべてhttp://reactivex.io/RxJava/2.x/javadoc/io/reactivex/disposables/Disposable.html#dispose--[Disposable.dispose()]および対応するhttp:/によって停止されることを意味します。/reactivex.io/RxJava/2.x/javadoc/io/reactivex/CompletableObserver.html[CompletableObservers]の登録は解除されます。

実用的な例として、バックアップファイルを同等のリモートストレージにストリーミングするときには amb() を使用できます。そして、最善のバックアップが終了したら処理を完了するか、エラーが発生したら処理を繰り返します。

6. 結論

この記事では、RxJavaの __Completable __typeについて簡単に説明しました。

Completable インスタンスを取得するためのさまざまなオプションから始めて、 __ andThen()、merge()、flatMapCompletable()、 and amb …​() 演算子を使用して Completables__をチェーン化して構成しました。

over on GitHub すべてのコードサンプルのソースを見つけることができます。