RxJava2:合并两个Maybe实现类似Option.orElse()的功能
嘿,这个需求其实刚好对应RxJava里switchIfEmpty()操作符的核心能力,完全能实现你要的类似Scala/Vavr中Option.orElse()的效果!
先给你直接上最简洁的实现:
import io.reactivex.rxjava3.core.Maybe; public class MaybeUtils { // 实现你要的combine方法 public static <T> Maybe<T> combine(Maybe<T> primary, Maybe<T> fallback) { return primary.switchIfEmpty(fallback); } }
为什么这个方法符合你的需求?
咱们拆解下它的行为:
- 如果第一个Maybe(primary)调用了onSuccess():合并后的Maybe会立刻发射这个成功值,直接终止,完全不会管第二个Maybe的状态
- 如果第一个Maybe调用了onComplete():合并后的Maybe会自动订阅第二个Maybe(fallback):
- 要是第二个Maybe调用onSuccess(),合并后的就发射这个值并终止
- 只有当第二个Maybe也调用onComplete()时,合并后的Maybe才会触发自己的onComplete()
为什么amb()不符合需求?
你提到的amb()系列方法逻辑是「只要任意一个源Observable/Maybe发射了任意事件(不管是onSuccess还是onComplete),就立刻终止并传递这个事件」。这就导致如果第一个Maybe是空的(触发onComplete),amb会直接结束,完全不会去订阅第二个Maybe,这和你要的「两个都完成才触发complete」的逻辑完全相反。
验证示例
给你几个测试场景,看看效果:
- 第一个Maybe成功,第二个忽略:
Maybe<String> primary = Maybe.just("来自第一个的成功值"); Maybe<String> fallback = Maybe.just("来自第二个的成功值"); MaybeUtils.combine(primary, fallback) .subscribe( value -> System.out.println("Success: " + value), error -> error.printStackTrace(), () -> System.out.println("Complete") ); // 输出:Success: 来自第一个的成功值
- 第一个Maybe完成,第二个成功:
Maybe<String> primary = Maybe.empty(); Maybe<String> fallback = Maybe.just("来自第二个的成功值"); MaybeUtils.combine(primary, fallback) .subscribe( value -> System.out.println("Success: " + value), error -> error.printStackTrace(), () -> System.out.println("Complete") ); // 输出:Success: 来自第二个的成功值
- 两个Maybe都完成:
Maybe<String> primary = Maybe.empty(); Maybe<String> fallback = Maybe.empty(); MaybeUtils.combine(primary, fallback) .subscribe( value -> System.out.println("Success: " + value), error -> error.printStackTrace(), () -> System.out.println("Complete") ); // 输出:Complete
如果你用的是RxJava 2,代码几乎完全一致,只是把包名换成io.reactivex即可。
内容的提问来源于stack exchange,提问作者David Moles
相关产品推荐
相关产品推荐

