rxjavaドキュメントの switchmapの定義はかなり曖昧であり、それはにリンク同じページ flatmapとして。2つの演算子の違いは何ですか?
rxjavaドキュメントの switchmapの定義はかなり曖昧であり、それはにリンク同じページ flatmapとして。2つの演算子の違いは何ですか?
回答:
ドキュメントによると(http://reactivex.io/documentation/operators/flatmap.html)
switchMap
以下のようなものですflatMap
、しかし、新たなイベントが観測可能な源から放出されるまで、それが唯一の新しい観測可能からアイテムを放出します。
大理石の図はそれをよく示しています。図の違いに注意してください。
switchMap
第二の元の発光(緑色大理石)その第二放射しないマップされた発光(緑色の正方形を第三以降)、元の発光(青色大理石)開始し、すでに第一輻射たマッピングされた発光(ブルーダイヤモンド)。つまり、マッピングされた 2つのグリーン排出のうち、最初のものが発生するだけです。青いひし形がそれを打ち負かしたので、緑色の四角は放出されません。
ではflatMap
、マップされた結果はすべて、「古くなった」場合でも出力されます。つまり、マップされた緑の放出の1番目と 2番目の両方が発生します- 緑の正方形が放出されます(整合性のあるマップ関数を使用した場合、放出されなかったため、2番目の緑のひし形が表示されます)最初のブルーダイヤモンド)
flatMap
.map(func).switch
が、と同じ.switchMap(func)
です。
「インスタント検索」を実装するときに、つまりユーザーがテキストボックスに入力するときに、これに遭遇しました。結果は、キーを押すたびにほぼリアルタイムで表示されます。解決策は次のようです:
flatMapを使用すると、検索応答が順不同になる可能性があるため、検索結果が古くなる可能性があります。これを修正するには、switchMapを使用する必要があります。これにより、新しいオブザーバブルが提供されると、古いオブザーバブルがサブスクライブ解除されることが保証されます。
したがって、要約すると、タイミングに関係なくすべての結果が重要な場合はflatMapを使用し、最後のObservableの問題からの結果のみが発生した場合はswitchMapを使用する必要があります。
いいえflatMapの議論は比較して対照的ななしで完全ではないswitchMap
、concatMap
とconcatMapEager
。
これらのメソッドはすべてFunc1
、ストリームをに変換するを受け取りObservable
ます。違いは、返されたObservable
がサブスクライブObservable
されたときとサブスクライブ解除されたとき、およびそれらのsの放出____Map
が問題のオペレーターによって放出された場合とそのときです。
flatMap
放出さObservable
れたをできるだけ多くサブスクライブします。(プラットフォームに依存する数値です。たとえば、Androidでは小さい数値です)順序が重要ではなく、排出をできるだけ早くしたい場合に使用します。concatMap
最初のサブスクライブをサブスクライブし、前のObservable
サブスクライブObservable
が完了したときにのみ次のサブスクライブをサブスクライブします。順序が重要で、リソースを節約したいときにこれを使用します。完璧な例は、最初にキャッシュをチェックしてネットワーク呼び出しを延期することです。通常は、不要な作業を行わないようにするために、.first()
またはが後に続き.takeFirst()
ます。
http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
ほぼ同じように機能しますが、できるだけ多くのサブスクライブ(プラットフォームに依存)しますが、前のバージョンObservable
が完了して初めて放出します。実行する必要のある並列処理がたくさんあるが、(flatMapとは異なり)元の順序を維持したい場合に最適です。
switchMap
最後Observable
に遭遇したものをサブスクライブし、以前Observable
のすべてのからサブスクライブ解除します。これは、検索提案などの場合に最適です。ユーザーが検索クエリを変更すると、古いリクエストは不要になるため、サブスクライブされず、適切に動作するApiエンドポイントがネットワークリクエストをキャンセルします。別のスレッドでObservable
はないを返す場合subscribeOn
、上記のメソッドはすべて同じように動作する可能性があります。ネストさObservable
れたが独自のスレッドで動作することを許可すると、興味深い便利な動作が現れます。次に、並列処理から多くの利点を得ることができ、Observable
あなたSubscriber
のに興味のないからの購読をインテリジェントに購読解除または購読しない
amb
興味があるかもしれません。任意の数のObservable
sを指定すると、最初Observable
に何かを放出するのと同じアイテムを放出します。これは、同じ結果を返すことができる/すべきである複数のソースがあり、パフォーマンスが必要な場合に役立ちます。たとえば、ソートの場合amb
、マージソートを使用してクイックソートし、どちらか速い方を使用できます。If you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.
- switchMap vs flatMap
私が以前に遭遇したすべての説明は、この重要な側面を逃しました、今、すべてがより明確になりました。ありがとうございました。
RxJS 4 では、switchMap はかつて flatMapLatest と呼ばれていました。
基本的には、最新の Observable からのイベントを渡し、以前のObservableからサブスクライブを解除します。
Map、FlatMap、ConcatMapおよびSwitchMapは、関数を適用するか、Observableによって発行されたデータを変更します。
マップは、ソースのObservableによって発行された各アイテムを変更し、変更されたアイテムを発行します。
FlatMap、SwitchMap、およびConcatMapも、放出された各アイテムに関数を適用しますが、変更されたアイテムを返す代わりに、再度データを放出できるObservable自体を返します。
FlatMapとConcatMapの動作はほとんど同じです。それらは、複数のObservableによって発行されたアイテムをマージし、単一のObservableを返します。
サンプルコードを探しているなら
/**
* We switch from original item to a new observable just using switchMap.
* It´s a way to replace the Observable instead just the item as map does
* Emitted:Person{name='Pablo', age=0, sex='no_sex'}
*/
@Test
public void testSwitchMap() {
Observable.just(new Person("Pablo", 34, "male"))
.switchMap(person -> Observable.just(new Person("Pablo", 0, "no_sex")))
.subscribe(System.out::println);
}
ここでより多くの例を見ることができますhttps://github.com/politrons/reactive
switchMap
てflatMap
もまったく同じように機能します。
次に、101行の例をもう1つ示します。それは私にとって事を説明します。
言われたように:それは最後のオブザーバブル(もしそうなら最も遅いもの)を取得し、残りを無視します。
結果として:
Time | scheduler | state
----------------------------
0 | main | Starting
84 | main | Created
103 | main | Subscribed
118 | Sched-C-0 | Going to emmit: A
119 | Sched-C-1 | Going to emmit: B
119 | Sched-C-0 | Sleep for 1 seconds for A
119 | Sched-C-1 | Sleep for 2 seconds for B
1123 | Sched-C-0 | Emitted (A) in 1000 milliseconds
2122 | Sched-C-1 | Emitted (B) in 2000 milliseconds
2128 | Sched-C-1 | Got B processed
2128 | Sched-C-1 | Completed
Aが無視されたことがわかります。