RxJava2结合两种可能的习惯用法
给定两个RxJava2结合两种可能的习惯用法,java,rx-java2,reactivex,Java,Rx Java2,Reactivex,给定两个Maybe值,如何将它们组合成一个Maybe值,该值将: 调用onSuccess()只要源中的任何一个调用onSuccess 调用onComplete() (参见或中的Option.orElse()) 例如,假设存在一个符合我要求的combine()方法: combine(Maybe.just(a), Maybe.empty()) ≍ Maybe.just(a) combine(Maybe.empty(), Maybe.just(b)) ≍ Maybe.just(b) combine
Maybe
值,如何将它们组合成一个Maybe
值,该值将:
onSuccess()
只要源中的任何一个调用onSuccess
onComplete()
combine()
方法:
combine(Maybe.just(a), Maybe.empty()) ≍ Maybe.just(a)
combine(Maybe.empty(), Maybe.just(b)) ≍ Maybe.just(b)
combine(Maybe.empty(), Maybe.empty()) ≍ Maybe.empty()
combine(Maybe.never(), /*anything*/ ) ≍ /*the thing*/
combine(/*anything*/, Maybe.never()) ≍ /*the thing*/
起初我以为amb()
&家族是我要找的,但只要源可能完成,就完成了,这意味着如果第一个可能完成时没有值,你就永远无法从第二个可能中获得值
现在我正在使用
Maybe.mergeArray(m1, m2).firstElement()
这似乎是我想要的,但我不确定这是正确的,也不确定这是最干净的方式。(例如,如果有延迟,当一个或另一个源调用时,它会立即调用onSuccess()
,还是会同时等待onComplete()
s?)
这是正确的吗?还有更惯用的方法吗
预计到达时间:我很乐意接受第一个值;我不需要等待两者都完成:
combine(Maybe.just(a), Maybe.just(b)) ≍ Maybe.just(/* a or b, don't care */)
(我可以想象,在什么情况下,我可能更喜欢其中一种,并希望通过参数的顺序来表明这一点,但在这种情况下,我怀疑顺序比并行更好。)有一种稍微不同的方法,可能更接近您的定义。这将使用:
将上游项目映射到MaybeSources
中,并将(订阅)切换到较新的项目,同时处理较旧的项目(并忽略其信号),并发出当前项目的最新成功值(如果可用),如果此可观察到的或任何活动内部MaybeSources
失败,则立即失败
但是使用Maybe.mergeArray(m1,m2).firstElement()的方法也应该足够了。firstElement()
操作符发出由mergeArray()发出的第一个元素。这一个是无序的,因此没有关于任何可能事件完成的信息。我相信zip
函数将在发出结果之前等待所有可观察到的源的终端事件,如果你想等待所有源的终端事件?@MarkKeen我不想等待终端事件;如果有一个值,我想先取哪个值。问题是当组合(只是(a),never())
时,第一个代码块中的答案是“never()”。但在编辑中,你说你不等待完成,所以应该是“只是(a)”。你的描述不一致。@DeanXu这是一个很好的观点。我将编辑该部分。@DavidMoles您的方法是最好的。唯一的问题是你可以使用merge
而不是mergeArray
我认为mergeArray()
更具可读性,但它确实看起来(在阅读之后;我认为switchMapXXX
文档需要更多的修订)更准确地抓住了意图,因为它不满足条件1。例如,当m1=Maybe.just(1).delay(1,秒)
和m2=Maybe.empty().delay(2,秒)
时,它将调用onComplete
,即使m1
在成功时调用
Observable.just(m1, m2).switchMapMaybe(m -> m).firstElement()