RxJava2将两个Single转换为Completable

时间:2017-11-10 14:15:17

标签: java android rx-java2

我有两个单打,我想做的是将这些转换成可完成的

 final Single<Boolean> httpRequestOne = createHttpRequestOne();
 final Single<Boolean> httpRequestTwo = createHttpRequestTwo();

如果两个单元都返回true,则Completable的结果应该是onSuccess,否则它将是onError。

我也希望它们并行运行,所以我认为concat在这里没有帮助

final Flowable<Boolean> flowable = httpRequestOne.concatWith(httpRequestTwo);

1 个答案:

答案 0 :(得分:2)

我会使用zip运算符,以便您可以:

  • 合并两项操作的结果
  • 并行化工作(订阅不同的调度程序)

最终您可以将两个结果转换为您想要的单个结果(在您的情况下,它只是一个逻辑AND)。

private Completable createCompletable() {
        return Single.zip(createHttpRequestOne().subscribeOn(Schedulers.newThread()),
                createHttpRequestTwo().subscribeOn(Schedulers.newThread()), (b1, b2) -> b1 && b2)
                .flatMap(new Function<Boolean, SingleSource<Boolean>>() {
                    @Override
                    public SingleSource<Boolean> apply(@NonNull Boolean aBoolean) throws Exception {
                        if (aBoolean) {
                            return Single.just(true);
                        } else {
                            return Single.error(new Throwable("one of the Single returned FALSE"));
                        }
                    }
                }).toCompletable();
    }

然后订阅它:

createCompletable()
     .subscribe(() -> logd("onCompelte"),
                throwable -> logd("error: " + throwable.getMessage()));

如果Single完全排名为TRUE,onComplete将从您的补丁中发出,否则您将收到错误,onError将在您的订阅中触发。