2016-05-18 3 views
1

フィルタリングして以下のようにitensを出すことは可能ですか?RxJavaフィルタと他のアイテムを送信


加入者2回呼び出して私のコード:私が欲しいもの

Observable<Map.Entry<String, ArrayList<MockOverview>>> requestEntries = 
     this.requestView.request(request) 
     .map(HashMap::entrySet) 
     .flatMapIterable(entries -> entries); 

requestEntries.filter(entry -> entry.getKey().equals("featured")) 
     .map((Func1<Map.Entry<String, ArrayList<MockOverview>>, List<MockOverview>>) Map.Entry::getValue) 
     .subscribe(mockOverviews -> { 
      Log.i("subscrive", "featured"); 
     }); 

requestEntries.filter(entry -> entry.getKey().equals("done")) 
     .map((Func1<Map.Entry<String, ArrayList<MockOverview>>, List<MockOverview>>) Map.Entry::getValue) 
     .subscribe(mockOverviews -> { 
      Log.i("subscrive", "featured"); 
     }); 

を:

requestEntries.filter(entry -> entry.getKey().equals("featured")) 
     .map((Func1<Map.Entry<String, ArrayList<MockOverview>>, List<MockOverview>>) Map.Entry::getValue) 
     .subscribe(mockOverviews -> { 

     }) 
     .filter(entry -> entry.getKey().equals("done")) 
     .map((Func1<Map.Entry<String, ArrayList<MockOverview>>, List<MockOverview>>) Map.Entry::getValue) 
     .subscribe(mockOverviews -> { 

     }); 

答えて

1

あなたが最初subscribe()

の代わりに doOnNextを使用することができますが
requestEntry.filter(v -> ...) 
.map(v -> ...) 
.doOnNext(v -> ...) 
.filter(v -> ...) 
.map(v -> ...) 
.subscribe(...) 

または使用publish(Func1):2番目のバージョンが最初に等しくない、物事のルックスによって

requestEntry.filter(v -> ...) 
.map(v -> ...) 
.publish(o -> { 
    o.subscribe(...); 
    return o; 
}) 
.filter(v -> ...) 
.map(v -> ...) 
.subscribe(...) 
2

:二回requestEntriesストリームの元ルックス、フィルターには、それぞれ行わキーを特色それを使って独自のことを行います。最初のフィルタはの最初のフィルタであり、最初にに変換され、その後、いくつかの変換と副作用が発生し、がフィルタされて、にフィルタされます。しかしながら、そのObservable<entryset>は、その第2のフィルタラムダでは全く範囲にない。あなたがここで行うに必要なもの

は、あなたの最初のバージョンからのものを行うonNext代わりのsubscribemergeストリームを使用し、その組み合わせストリームを返しrequestEntries上及びラムダでpublish(<lambda>)を使用しています。その後、publishの外にいったん登録すれば(そしてそこに何もしないで)続行し、あなたのストリームの結果を別の場所で使用します。

requestEntries.publish(re -> { 
    Observable<...> x = re.filter(...<featured>...).map(...).doOnNext(...Log.i(...)); 
    Observable<...> y = re.filter(...<done>...).map(...).doOnNext(...Log.i(...)); 
    return x.mergeWith(y); 
}) 
関連する問題