我有一个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) {}
});
答案 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();