用于组合两个 Maybe 的 RxJava2 习语
RxJava2 idiom for combining two Maybes
给定两个 Maybe
值,我怎样才能将它们组合成一个 Maybe
,它将:
- 每当源
Maybes
调用 onSuccess
时调用 onSuccess()
- 每当源
Maybes
的 both 调用 onComplete()
? 时调用 onComplete()
(参见Scala or 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()
?)
这是正确的吗?有没有更惯用的方法?
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()
flowable 发出的第一个元素。这是无序的,因此没有关于任何可能完成的信息。
给定两个 Maybe
值,我怎样才能将它们组合成一个 Maybe
,它将:
- 每当源
Maybes
调用onSuccess
时调用 - 每当源
Maybes
的 both 调用onComplete()
? 时调用
onSuccess()
onComplete()
(参见Scala or 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()
?)
这是正确的吗?有没有更惯用的方法?
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 innerMaybeSources
fail.
Observable.just(m1, m2).switchMapMaybe(m -> m).firstElement()
但是使用 Maybe.mergeArray(m1, m2).firstElement()
的方法也应该足够了。 firstElement()
运算符发出由 mergeArray()
flowable 发出的第一个元素。这是无序的,因此没有关于任何可能完成的信息。