You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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」的逻辑完全相反。

验证示例

给你几个测试场景,看看效果:

  1. 第一个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: 来自第一个的成功值
  1. 第一个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: 来自第二个的成功值
  1. 两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:03:57