如果有两个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()
&家庭是我正在寻找的,但是一旦源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 */)
(我可以想象我可能更喜欢其中一种情况的情况,并希望通过参数的顺序来表明,但在那种情况下,我怀疑顺序会比并行更好。)
答案 0 :(得分:1)
这种方法略有不同,可能与您的定义有点接近。这将使用Observable.switchMapMaybe()
:
将上游项目映射到
MaybeSources
并切换(订阅)更新的项目,同时处理旧项目(并忽略其信号)并发出当前项目的最新成功值(如果可用),同时立即失败Observable或任何活动的内部MaybeSources
失败。
Observable.just(m1, m2).switchMapMaybe(m -> m).firstElement()
但使用Maybe.mergeArray(m1, m2).firstElement()
的方法也应该足够了。 firstElement()
运算符发出mergeArray()
可流动的第一个元素。这个是无序的,因此没有关于任何maybes完成的信息。