RxJava2中的条件完全表

RxJava2中的条件完全表,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我经常发现自己创建的流依赖于单个提供的某些条件。考虑这个例子: @测试 公开无效测试(){ 可观测范围(0,10) .flatMapSingle(此::shouldDoStuff) .flatMapCompletable(shouldDoStuff->shouldDoStuff?doStuff():Completable.complete()) .test(); } 私人单间应提供(整数){ 返回Single.just(数字%2==0); } 私有可完成doStuff(){ 返回Completa

我经常发现自己创建的流依赖于
单个
提供的某些条件。考虑这个例子:

@测试
公开无效测试(){
可观测范围(0,10)
.flatMapSingle(此::shouldDoStuff)
.flatMapCompletable(shouldDoStuff->shouldDoStuff?doStuff():Completable.complete())
.test();
}
私人单间应提供(整数){
返回Single.just(数字%2==0);
}
私有可完成doStuff(){
返回Completable.fromAction(()->System.out.println(“Did stuff”));
}
我发现
flatMapSingle(…).flatMapCompletable(…)
部分没有必要冗长

可能有运营商可以简化这一过程,例如:

可观测范围(0,10)
.flatMapSingle(此::shouldDoStuff)
.flatMapCompletableIfTrue(doStuff())
.test();
或包装两行的静态构造函数,例如:

可观测范围(0,10)
.flatMapCompletable(数字->可完成的.ifTrue(shouldDoStuff(数字),doStuff())
.test();

如果此类条件检查将成为您的许多流的一部分,请告诉我您将如何实施此操作。

您可以对
shouldDoStuff
的结果使用
过滤器
运算符

 Observable.range(0, 10)
            .flatMapSingle(this::shouldDoStuff)
            .filter(shouldDo -> shouldDo)  // this will emit to the downstream only if shouldDo = true
            .flatMapCompletable(__ -> doStuff())
            .test();
或者尝试编写一个包装器,使代码更具可读性(通过将相同的逻辑移动到包装器)


谢谢你的建议。不幸的是,
filter
方法更加冗长。此外,它还防止事件向下游移动。我知道在这个简单的例子中这没有问题,但是想象一下,如果流有多个条件,或者在
.test()
之前继续,那么需要嵌套。如果您使用的是Kotlin,那么您可以对
Completable
类使用扩展函数
ifTrue
。在java中,您可以为此编写一个包装器类,这将使代码更具可读性。这只是一个建议,不确定它是否完全符合您的要求。请查看更新的答案
  class CompletableIfTrue {
    public static CompletableSource when(Single<Boolean> shouldDoStuff, Completable doStuff) {
        return shouldDoStuff.flatMapCompletable(shouldDo -> shouldDo ? doStuff : Completable.complete());
    }
Observable.range(0, 10)
     .flatMapCompletable(number -> CompletableIfTrue.when(shouldDoStuff(number), doStuff()))
     .test();