web-dev-qa-db-ja.com

Reactivexのコンシューマーインターフェイスの使用

ReactiveXは初めてです。私はソースコードを読むことからそれを学びました。すべてが非常に明確でしたが、突然、インターフェースである「消費者」という名前のこの単語を受け取りました。オブザーバーの代わりに使用されました。

誰かが私にそれが正確に何をしているのかを教えてもらえますか?

私はいくつかのリンクをたどりましたが、それらはすべて1つのステートメントだけを言っていましたコンシューマーは、単一の値を受け入れる関数型インターフェース(コールバック)です。

私はそれの正確な働きを知りたいです。

  1. それは何ですか?
  2. なぜそれが必要なのですか?
  3. それをどうやって使いますか?
  4. オブザーバーの代わりになりますか?はいの場合、その方法と理由は?
16
Abhishek Kumar

Consumer は単純なJava T型の変数を受け入れるインターフェースであり、あなたが言ったように、それはコールバックに使用されます。

例:

import io.reactivex.functions.Consumer;

Flowable.just("Hello world")
  .subscribe(new Consumer<String>() {
      @Override public void accept(String s) {
          System.out.println(s);
      }
  });

なぜ機能するのですか?オブザーバーの代わりにコンシューマーをどのように使用できますか?

RxJavaは単にオブザーバーを作成し、コンシューマーをそれに渡し、onNextで呼び出されます。

更新

LambdaObserverは、4つの機能インターフェースから作成され、それらをコールバックとして使用する一種のオブザーバーです。主にJava 8 lambda expression を使用するためのものです。次のようになります。

Observable.just(new Object())
                .subscribe(
                        o -> processOnNext(o),
                        throwable -> processError(throwable),
                        () -> processCompletion(),
                        disposable -> processSubscription()
                );
14
Amaksoft

Consumerは、購読時に受け取る値を消費します。放出されたデータをコールバックとして渡すSubscriberのようなものです。

Consumerは、ジェネリックTypeのコールバックを持つ単純なインターフェースであり、Observableによって発行されたアイテムを受け取るために必要です。

エラーをキャッチしないコンシューマしかなく、デバッグによって問題が発生する可能性があることに注意してください。

Throwableを受け取る別のコンシューマーを2番目のパラメーターとして使用することで、これを解決できます。

Flowable.just("Hello world")
  .subscribe(
            emittedData -> System.out.println(s), 
            error -> System.out.println("Error occured: "+ error)
);
4
Emanuel S

私の控えめな意見では、消費者はリバース/双方向ストリームに向いています。

たとえば、データソースは、パラメータ「X」から実行される複雑な時間依存操作の「Y」を「ホット」フロー可能(HF)の形式で発行します。

パラメータXが「ホット」オブザーバブル(HO)を介して発行されるとすると、データソースは、「HO」にサブスクライブし、HFを介して複雑な操作の結果を発行するコンシューマになることができます。

この場合、双方向ストリームがあり、コンシューマーを使用して、データソースのHOから提供された日付をプッシュします。

私の答えが本当に正しいかどうかはわかりません... rxは少し複雑です:B

0