[英]RxJava filter and emit other items
它可能會過濾並繼續發出itens,如下所示?
我的代碼兩次調用訂戶:
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 -> {
});
從外觀上看,您的第二個版本與您的第一個版本不相等:前者兩次查看requestEntries
流,分別對功能鍵和完成鍵進行過濾,並使用它自己做事。 但是,您的第二個版本會先過濾精選功能,然后進行一些轉換和副作用,然后過濾掉完成的操作 。 但是,該Observable<entryset>
根本不在該第二個過濾器lambda的范圍內。
你需要做的是使用publish(<lambda>)
上requestEntries
並在拉姆達從你的第一個版本做的東西,使用onNext
而不是subscribe
, merge
流並返回該組合流。 然后,在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);
})
您可以在第一個doOnNext
subscribe()
處使用doOnNext
requestEntry.filter(v -> ...)
.map(v -> ...)
.doOnNext(v -> ...)
.filter(v -> ...)
.map(v -> ...)
.subscribe(...)
或使用publish(Func1)
:
requestEntry.filter(v -> ...)
.map(v -> ...)
.publish(o -> {
o.subscribe(...);
return o;
})
.filter(v -> ...)
.map(v -> ...)
.subscribe(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.