2017-01-06 8 views
0

なぜRxJava 1.xのflatMap()演算子がmergeで実装されていますか?RxJavaでflatMapがmergeで実装されているのはなぜですか?

flatMap(から
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) { 
     if (getClass() == ScalarSynchronousObservable.class) { 
      return ((ScalarSynchronousObservable<T>)this).scalarFlatMap(func); 
     } 
     return merge(map(func)); 
    } 

は)私が<? extends Observable<? extends R>>に準拠して唯一の観測を返すことができます呼び出します。 map(func)コールよりも別のObservableにラップするので、Observable<? extends Observable<? extends R>>のようなものになります。それで、map(func)の後にmerge()を呼び出す必要はないと私は思います。

マージ()演算子は、以下を実行するように言われている。

は任意 変換することなく、これらの観測によって放出されたアイテムを発すること 単一の観測に観測を発するその観測を平坦にします。

フラットマップの内部には、Observableが1つしかないObservableを生成できます。なぜマージするのですか?私はここで何が欠けていますか?

ありがとうございます。

答えて

3

は役立つかもしれない:

Observable<String>では、個々の文字にflatMapにしたいことを想像してみてください。 flatMapでこれを行う方法は次のとおりです。

Observable.just("foo", "hello") 
      .flatMap(s -> Observable.from(s.split(""))) 

このObservableの種類は何ですか?それはObservable<String>です。

flatMapの代わりに、mapと同じ機能のを使用してください。タイプは何ですか?

Observable.just("foo", "hello") 
      .map(s -> Observable.from(s.split(""))) 

あなたはそれが実際にObservable<Observable<String>> ... であることがわかりますそして、我々は、この観測可能に加入し、放出された項目をプリントアウトした場合、我々はこの取得:非常に便利な

[email protected] 
[email protected] 

をされていません。さらに悪いことに、これらのObservable Sが加入されていないので、彼らはすべてのデータを放出しません:(

我々はflatMapの目標は、関数がソースアイテムごとに内部Observable<T>を生成させ、その後に加入していることがわかりこれらの内部観測値は出力Observable<T>で一緒に放出を平らにします。そしてmergeはそれだけです!それを確認する

は、Observable.merge(...)上記マップ結果をラップ:

Observable<Observable<String>> mapped = 
    Observable.just("foo", "hello") 
       .map(s -> Observable.from(s.split(""))); 

Observable.merge(mapped) 
      .subscribe(System.out::println); 

この出力:

f 
o 
o 
h 
e 
l 
l 
o 
1

フラットマップの内部には、Observableを1つだけ発行することができます。

はありません - あなたは、ソース、観察項目につき1観測可能を発する観察可能な1持っています。したがって、あなたの観測可能な観測可能物がもっと多くのアイテムを持っているなら、あなたは複数の観測値を放出するでしょう。

だからこそ、merge()が必要です。署名を見ると

関連する問題