RxJava 的 Maybe的用法:

4 阅读3分钟

一、一句话定义

Maybe 是 RxJava 3 里的被观察者(上游)三种结果只会触发其中一种:

  1. 发送一个数据
  2. 发送完成(无数据)
  3. 发送异常

可以理解为:有可能有值,有可能没值,有可能出错,所以叫 Maybe(也许、可能)

接口源码本质

java

运行

public interface MaybeSource<T> {
    void subscribe(MaybeObserver<? super T> observer);
}

泛型 <T>:你要返回的数据类型

二、和 Rx 另外三个最容易混淆的对比(必背)

你项目里肯定经常见这四个,我一次性分清:

  1. Observable可以发 0~N 个数据(多次发送)
  2. Single****必须发 1 个数据 或者 异常
  3. Completable****不发任何数据,只通知完成 / 异常
  4. Maybe****要么 1 个数据,要么完成(无数据),要么异常Single + Completable 结合体
类型能返回数据?数量
Observable多个
Single有且仅有 1 个
Completable0 个,只完成
Maybe可能有,可能没有0 个 或 1 个

三、基础完整用法(Java 版,最简单示例)

1. 创建 Maybe

java

运行

Maybe<String> maybe = Maybe.create(emitter -> {
    // 发送一个数据
    emitter.onSuccess("数据");

    // 或者 不发数据,直接完成
    // emitter.onComplete();

    // 或者 发送异常
    // emitter.onError(new Exception("出错"));
});

2. 订阅(接收结果)

java

运行

maybe.subscribe(
    // 1. 成功并且有数据
    data -> {
        // 拿到数据
    },
    // 2. 异常回调
    error -> {
        // 出错了
    },
    // 3. 完成回调(没有数据时走这里)
    () -> {
        // 无数据,执行完成逻辑
    }
);

极简 Lambda 写法(项目里最常见)

java

运行

maybe.subscribe(
    value -> {},   // 有值
    throwable -> {},// 异常
    () -> {}        // 无值完成
);

四、你 Android 项目里,Maybe 一般用来干嘛?

结合你之前所有知识点:ARouter 获取服务、SP/MMKV 取值、数据库查询、接口请求、页面数据、缓存读取

非常典型场景:

我去拿一个数据有可能拿到,有可能为空,有可能请求出错

完美适配 Maybe比如:

java

运行

Maybe<UserInfo> getUserInfo();
  • 有用户信息 → onSuccess
  • 没登录 / 没数据 → onComplete
  • 网络异常、解析失败 → onError

比 Single 灵活,比 Observable 严谨(不会多次回调)。

五、常用操作符(项目高频)

1. 切换线程(Android 必用)

java

运行

Maybe.create(...)
    .subscribeOn(Schedulers.io())       // 上游在IO线程执行
    .observeOn(AndroidSchedulers.mainThread()) // 下游回调主线程

2. 空值默认值

java

运行

// 如果没有数据(走onComplete),给一个默认值
maybe.defaultIfEmpty("默认值")

3. 转换数据 map

java

运行

maybe.map(data -> new Bean(data))

4. 过滤

java

运行

maybe.filter(value -> value != null)

七、终极精简总结(面试 + 理解背诵版)

  1. Maybe = RxJava 被观察者

  2. 事件只有三种结局 三选一

    • onSuccess(T):有1 个数据
    • onComplete()无数据,正常结束
    • onError():异常
  3. 适用场景:查询、获取数据、读取缓存、跨模块拿服务结果不确定(有值 / 空 / 异常)

  4. 区别:

    • Single 必须有值
    • Completable 完全无值
    • Maybe 二者结合,最灵活
  5. 回调三个参数:有值、异常、无值完成

八、额外提醒(极易踩坑)

很多人分不清:

  • onComplete 和 onSuccess 只会走一个
  • 一旦走了 onSuccess就不会走 onComplete
  • 只有全程没发送任何数据,才会走 onComplete