给定两个Maybe
值,我如何将它们组合为一个Maybe
,该代码可以:
onSuccess()
中的任何一个调用Maybes
onSuccess
onComplete()
都调用Maybes
时调用onComplete()
? (参见Scala或Vavr中的
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()
和family是我想要的,但是只要其中一个源Maybe
完成,它就完成了,这意味着如果第一个Maybe
完成时没有值,则您永远不会从第二个Maybe
中获取值。现在我正在使用
Maybe.mergeArray(m1, m2).firstElement()
这似乎可以满足我的要求,但我不确定它是否正确,也不确定这是最干净的方法。 (例如,如果有一些延迟,它会在一个或另一个来源同时调用
onSuccess()
还是会等待两个onComplete()
?)这样对吗?有没有更惯用的方法?
预计到达时间:我很高兴取得第一个价值;我不需要等待两者都完成:
combine(Maybe.just(a), Maybe.just(b)) ≍ Maybe.just(/* a or b, don't care */)
(我可以想象在某些情况下我可能更喜欢一个或另一个,并希望通过参数的顺序来表明这一点,但是在那种情况下,我怀疑顺序会比并行好。)
最佳答案
有一种稍微不同的方法,可能与您的定义更接近。这将使用 Observable.switchMapMaybe()
:
将上游项映射为MaybeSources
并切换(订阅)到较新的项,同时处置较旧的项(并忽略它们的信号),并发出当前项的最新成功值(如果可用),如果此Observable或任何 Activity 的内部组件立即失败MaybeSources
失败。
Observable.just(m1, m2).switchMapMaybe(m -> m).firstElement()
但是使用
Maybe.mergeArray(m1, m2).firstElement()
的方法也应该足够。 firstElement()
运算符发出mergeArray()
flowable发出的第一个元素。这是无序的,因此没有任何可能完成的信息。