Android 带有可选条件的RxJava2链命令

Android 带有可选条件的RxJava2链命令,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我仍在试图找出反应式编程,并试图用RxJava2创建一个链。创建订单(伪代码)时的逻辑如下所示 我已经创建了4个Singles,用于创建r1、r2、r3和顺序,但我不知道如何将所有这些链接在一起,以使用上述逻辑生成整个序列 我认为我们可以使用几个可能s进行if(condition)检查,但不确定如何将它们与单个s链接在一起以实现上述目的 非常感谢您的帮助。通过对逻辑的重新排序,将其转换为反应链并不困难 您需要做的是观察可能的最终结果是什么,以及达到这些结果的要求是什么: r1或作为备份的r2必须

我仍在试图找出反应式编程,并试图用RxJava2创建一个链。创建订单(伪代码)时的逻辑如下所示

我已经创建了4个Singles,用于创建r1、r2、r3和顺序,但我不知道如何将所有这些链接在一起,以使用上述逻辑生成整个序列

我认为我们可以使用几个
可能
s进行
if(condition)
检查,但不确定如何将它们与
单个
s链接在一起以实现上述目的


非常感谢您的帮助。

通过对逻辑的重新排序,将其转换为反应链并不困难

您需要做的是观察可能的最终结果是什么,以及达到这些结果的要求是什么:

  • r1
    或作为备份的
    r2
    必须有一个值
  • 如果
    r3
    有值,则与上一个结果合并
  • 如果该值存在,则转换为顺序
  • 第1点。可以通过考虑每个变量a
    Maybe
    对象,然后使用
    Maybe.switchIfEmpty
    计算值来构造

    第2点。可以使用第二个
    flatmap
    实现,该实现允许根据
    r3
    的结果做出不同的反应

    第3点。也可以在flatmap中完成,使用
    单个
    完成,如果上述步骤未产生结果,则会抛出错误

    这将导致以下伪实现:

    Maybe<R> r1 = Maybe.defer(() -> {
        if (condition1)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    Maybe<R> r2 = Maybe.defer(() -> {
        if (condition2)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    Maybe<R> r3 = Maybe.defer(() -> {
        if (condition3)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    return r1.switchIfEmpty(r2).flatMap((r1r2) -> {
        return r3.flatMap(
            (r3val) -> Maybe.just(create order with r1r2 + r3val),
            (err) -> Maybe.error(err),
            () -> Maybe.just(create order with r1r2)
        );
    }).switchIfEmpty(Single.defer(() -> {
        return Single.error(fail creating an order);
    }));
    
    Maybe r1=Maybe.defer(()->{
    如果(条件1)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    可能r2=可能。延迟(()->{
    如果(条件2)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    Maybe r3=Maybe.defer(()->{
    如果(条件3)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    返回r1.switchIfEmpty(r2).flatMap((r1r2)->{
    返回r3.flatMap(
    (r3val)->可能。只是(用r1r2+r3val创建订单),
    (错误)->可能。错误(错误),
    ()->也许吧。只是(用r1r2创建订单)
    );
    }).switchIfEmpty(单个.defer(()->{
    返回单个错误(创建订单失败);
    }));
    

    此代码的最终结果将是
    单个

    逻辑重新排序,转换为反应链并不困难

    您需要做的是观察可能的最终结果是什么,以及达到这些结果的要求是什么:

  • r1
    或作为备份的
    r2
    必须有一个值
  • 如果
    r3
    有值,则与上一个结果合并
  • 如果该值存在,则转换为顺序
  • 第1点。可以通过考虑每个变量a
    Maybe
    对象,然后使用
    Maybe.switchIfEmpty
    计算值来构造

    第2点。可以使用第二个
    flatmap
    实现,该实现允许根据
    r3
    的结果做出不同的反应

    第3点。也可以在flatmap中完成,使用
    单个
    完成,如果上述步骤未产生结果,则会抛出错误

    这将导致以下伪实现:

    Maybe<R> r1 = Maybe.defer(() -> {
        if (condition1)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    Maybe<R> r2 = Maybe.defer(() -> {
        if (condition2)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    Maybe<R> r3 = Maybe.defer(() -> {
        if (condition3)
            return Maybe.just(new R());
        else 
            return Maybe.empty();
    });
    
    return r1.switchIfEmpty(r2).flatMap((r1r2) -> {
        return r3.flatMap(
            (r3val) -> Maybe.just(create order with r1r2 + r3val),
            (err) -> Maybe.error(err),
            () -> Maybe.just(create order with r1r2)
        );
    }).switchIfEmpty(Single.defer(() -> {
        return Single.error(fail creating an order);
    }));
    
    Maybe r1=Maybe.defer(()->{
    如果(条件1)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    可能r2=可能。延迟(()->{
    如果(条件2)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    Maybe r3=Maybe.defer(()->{
    如果(条件3)
    可能返回。只是(新的R());
    其他的
    返回Maybe.empty();
    });
    返回r1.switchIfEmpty(r2).flatMap((r1r2)->{
    返回r3.flatMap(
    (r3val)->可能。只是(用r1r2+r3val创建订单),
    (错误)->可能。错误(错误),
    ()->也许吧。只是(用r1r2创建订单)
    );
    }).switchIfEmpty(单个.defer(()->{
    返回单个错误(创建订单失败);
    }));
    

    此代码的最终结果将是
    单个

    您对r1、r2、r3的定义是什么?您需要提供更多关于您试图做什么的信息。它们是简单的Java对象。基本上,if检查是创建对象r1、r2、r3所基于的各种条件检查(如上所示)。r1、r2、r3的创建是否应该是异步的?它们可以是异步的,但需要在创建订单之前全部完成。这看起来像是FizzBuzz问题,但与RxJava有关。不要想太多。你说r1,r2,r3是什么意思?您需要提供更多关于您试图做什么的信息。它们是简单的Java对象。基本上,if检查是创建对象r1、r2、r3所基于的各种条件检查(如上所示)。r1、r2、r3的创建是否应该是异步的?它们可以是异步的,但需要在创建订单之前全部完成。这看起来像是FizzBuzz问题,但与RxJava有关。不要想太多。