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