可以像下面那样过滤并继续发出它吗?
我的代码称用户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 -> {
});
答案 0 :(得分:3)
根据事物的外观,您的第二个版本不等于您的第一个:前者查看requestEntries
流两次,过滤精选和完成键分别用它做自己的事情。然而,您的第二个版本首先过滤精选,然后执行一些转换和副作用,然后过滤掉完成。但是,Observable<entryset>
在第二个过滤器lambda中的范围完全没有。
您需要在requestEntries
上使用publish(<lambda>)
,在lambda中使用第一个版本中的内容,使用onNext
代替subscribe
,{{ 1}}流并返回组合流。然后在merge
之外订阅一次(并且在那里什么也不做)或者继续在其他地方使用你的流的结果。
publish
答案 1 :(得分:2)
您可以在第一个doOnNext
subscribe()
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(...)