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()
  • (参见或中的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.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()