RxJava2用于组合两个Maybes的习语

时间:2018-03-14 22:29:14

标签: java rx-java2 reactivex

如果有两个Maybe值,我怎样才能将它们合并为一个Maybe

  1. 每当源onSuccess()调用Maybes
  2. 时,都会致电onSuccess
  3. onComplete()来电Maybes 两个时拨打onComplete()
  4. (参见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获得值

    现在我正在使用

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

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

    这是对的吗?是否有更惯用的方法?

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

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

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

1 个答案:

答案 0 :(得分:1)

这种方法略有不同,可能与您的定义有点接近。这将使用Observable.switchMapMaybe()

  

将上游项目映射到MaybeSources并切换(订阅)更新的项目,同时处理旧项目(并忽略其信号)并发出当前项目的最新成功值(如果可用),同时立即失败Observable或任何活动的内部MaybeSources失败。

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

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