5

私はRxJavaが初めてで、flatMap関数にしばしば混乱します。ドキュメントによると、フラットマップtransform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable

誰かがそれの良いユースケースを与えることができますか? 元の Observable を Observable (複数) に変換してから、それらを単一の Observable に変換するのはなぜですか。

なぜ「地図」を使わないのですか?

Android で素晴らしい例を挙げるとすれば、それ以外の場合はプレーンな Java で十分です。ありがとう

4

3 に答える 3

13

あなたが持っているとしましょう

Observable<Foo> fooObservable;

Fooそして、を受け取って を発行する別のメソッドを呼び出したいとします。Observable<Bar>

何かのようなもの:

public Observable<Bar> getBars(Foo foo);

あなたがした場合:

fooObservable.map(foo -> getBars(foo));

あなたが->をObservable<Observable<Bar>>変換したので、あなたはおそらくあなたが望むものではないでしょう。FooObservable<Bar>

代わりにflatMap、「観測可能なものを平坦化する」を使用できます。

Observable<Bar> barObservable = fooObservable.flatMap(foo -> getBars(foo));
于 2015-08-07T10:41:20.833 に答える
2

UI イベントの一部を監視可能なバックグラウンド タスクに変換するためによく使用します。

ViewObservable.clicks(calculateBtn)
    .flatMap(new Func1<OnClickEvent, Observable<Integer>>() {
      @Override
      public Observable<Integer> call(OnClickEvent onClickEvent) {
          return observeBackgroundOperation()
            .observeOn(AndroidSchedulers.mainThread())//interaction with UI must be performed on main thread
            .doOnError(new Action1<Throwable>() {//handle error before it will be suppressed
                @Override
                public void call(Throwable throwable) {
                    progress.setVisibility(View.GONE);
                    calculateBtn.setEnabled(true);
                    Toast.makeText(IOCombineSampleActivity.this, R.string.mix_error_message, Toast.LENGTH_SHORT).show();
                }
            })
            .onErrorResumeNext(Observable.<Integer>empty());//prevent observable from breaking
      }
    })
    .subscribe(new Action1<Integer>() {...});

observable を使用してバックグラウンド操作を定義するのは簡単なので、flatMapボタン クリック イベントを「バックグラウンド イベントで行われる何か」(たとえば、Retrofit で終了するネットワーク リクエスト) に変換してから観察していました。

flatMapオブザーバブルは単一の値を発行できることに注意してください。これはサンプルで行われます。

このようにして、UI とバックグラウンド プロセス間の相互作用を宣言的に定義しました。でエラーを処理しdoOnError、それを使用onErrorResumeNext(Observable.<Integer>empty())してオブザーバブルが で終了するのを防ぎますonError。私は を使用しているためflatMap、オブザーバブルは完了せず (内部flatMapは完了していません)、次のクリック イベントを待機しています。

私の記事で見つけることができるコードの完全なサンプル。

于 2015-08-07T21:05:22.263 に答える