编程语言
首页 > 编程语言> > RxJava2用于组合两个Maybes的习语

RxJava2用于组合两个Maybes的习语

作者:互联网

给定两个Maybe值,我如何将它们组合成一个可能会:

>只要源Maybes中的任何一个调用onSuccess,就调用onSuccess()
>只要两个源Maybes都调用onComplete(),就调用onComplete()?

(参见ScalaVavr中的Option.orElse().)

例如,假设存在一个执行我想要的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没有值完成,你永远不会从第二个Maybe获得值.

现在我正在使用

Maybe.mergeArray(m1, m2).firstElement()

这似乎做我想要的,但我不确定它是否正确,我不确定这是最干净的方法. (例如,如果有一些延迟,它会在一个或另一个源执行时立即调用onSuccess(),还是等待onComplete()s?)

它是否正确?有更惯用的方法吗?

ETA:我很高兴获得第一个价值;我不需要等待两者都完成:

combine(Maybe.just(a), Maybe.just(b))  ≍ Maybe.just(/* a or b, don't care */)

(我可以想象我可能更喜欢其中一种情况的情况,并希望通过参数的顺序来指示,但在那种情况下,我怀疑顺序会比并行更好.)

解决方法:

有一种略微不同的方法,可能会更接近您的定义.这将使用Observable.switchMapMaybe()

Maps the upstream items into MaybeSources and switches (subscribes) to the newer ones while disposing the older ones (and ignoring their signals) and emits the latest success value of the current one if available while failing immediately if this Observable or any of the active inner MaybeSources fail.

Observable.just(m1, m2).switchMapMaybe(m -> m).firstElement()

但是使用Maybe.mergeArray(m1,m2).firstElement()的方法也应该足够了. firstElement()运算符发出mergeArray()可流动的第一个元素.这个是无序的,因此没有关于任何maybes完成的信息.

标签:java,rx-java2,reactivex
来源: https://codeday.me/bug/20190705/1389010.html