RxJava过滤并发出其他项目

时间:2016-05-18 18:25:54

标签: java rx-java rx-android

可以像下面那样过滤并继续发出它吗?

我的代码称用户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 -> {

        });

2 个答案:

答案 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(...)