如何在RxJava2上保留有关原始observable的信息

时间:2017-09-05 15:10:14

标签: rx-java2

我有一个REST调用返回一个集合(原始),这个集合被过滤但在订阅onSuccess我得到了原始列表和过滤的列表。

我不知道如何通过'第二个元素,我应该使用哪个运算符来获得这个结果?

我在

下面展示了我的代码的简化版本
    Observable.fromCallable(new Callable<List<Integer>>() {
        @Override public List<Integer> call() throws Exception {
            // dynamic list obtained from REST call
            // for simplicity here I return a list
            return Arrays.asList(1, 2, 3, 4);
        }
    })
            .flatMap(new Function<List<Integer>, ObservableSource<Integer>>() {
                @Override public ObservableSource<Integer> apply(List<Integer> integers) throws Exception {
                    return Observable.fromIterable(integers);
                }
            })
            .filter(new Predicate<Integer>() {
                @Override public boolean test(Integer integer) throws Exception {
                    return integer > 2;
                }
            })
            .toList()
            .subscribe(new SingleObserver<List<Integer>>() {
                @Override public void onSubscribe(Disposable d) {}

                @Override public void onSuccess(List<Integer> value) {
                    ///////////////////
                    // here I want both original and filtered list
                    ///////////////////
                }

                @Override public void onError(Throwable e) {}
            });

1 个答案:

答案 0 :(得分:0)

一种方法是使用ConnectableObservable。您需要分享初始流的排放量。像这样的东西

ConnectableObservable<List<Integer>> connectableObservable
                = Observable.fromCallable(() -> {
                    // dynamic list obtained from REST call
                    // for simplicity here I return a list
                    return Arrays.asList(1, 2, 3, 4);
                }).publish();

        Single.zip(connectableObservable.flatMapIterable(integers -> integers)
                .filter(integer -> integer > 2)
                    .toList(),
                 connectableObservable.elementAtOrError(0),
                 (integers, lists) -> combine(integers, lists))
                .subscribe(o -> {
                    ///////////////////
                    // here you ll have a new object containing both the initial list and the filtered list
                    ///////////////////
                });
        connectableObservable.connect();