带有可选条件的RxJava2链命令

时间:2017-11-11 23:18:18

标签: android rx-java rx-java2

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

void createOrder {
    R r1 = null, r2 = null, r3 = null;
    Order order = null;
    if (condition1) {
        then r1 = new R();
    } else if (condition2) {
        then r2 = new R();
    }

    if (condition3) {
        then r3 = new R();
    }

    if (r1 not null) {
        if (r3 not null) {
            create order with r1 + r3
        } else {
            create order with r1
        }
    } else if (r2 not null) {
        if (r3 not null) {
            create order with r2 + r3
        } else {
            create order with r2
        }
    } else {
        fail creating an order
    }   
}

我已经创建了4个Single来完成创建r1,r2,r3和顺序的工作,但我无法弄清楚如何将所有这些链接在一起以使用上述逻辑生成整个序列

我认为我们可以使用多个Maybe来进行if (condition)检查,但我不确定如何将它们与Single链接在一起以实现上述目标。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

通过对逻辑进行一些重新排序,转换为反应链并不困难。

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

  1. r1或备份r2必须具有值
  2. 如果r3有值,请与之前的结果合并
  3. 如果此值存在,请转为订单。
  4. 可以通过考虑每个变量Maybe<R>对象,然后使用Maybe.switchIfEmpty来计算值来构建第1点。

    第2点可以使用第二个flatmap实现来实现,该实现允许基于r3的结果进行不同的反应。

    第3点也可以在flatmap中完成,如果上述步骤没有产生结果,则使用Single<Order>进行最终定型会抛出错误。

    这导致以下伪实现:

    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);
    }));
    

    此代码的最终结果为Single<Order>