gpt4 book ai didi

java - 用于组合两个 Maybe 的 RxJava2 习语

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:56 25 4
gpt4 key购买 nike

给定两个 Maybe 值,我如何将它们组合成一个 Maybe 将:

  1. 调用 onSuccess() 每当源 Maybes 调用 onSuccess
  2. 调用 onComplete() 每当 bothMaybes 调用 onComplete() 时?

(参见 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() & 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() :

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() 可流动发出的第一个元素。这是无序的,因此没有关于任何 maybe 完成的信息。

关于java - 用于组合两个 Maybe 的 RxJava2 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com