RxJava的5大核心类型如何选?Flowable、Observable、Single、Maybe与Completable完整对比
【免费下载链接】RxJavaRxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.项目地址: https://gitcode.com/gh_mirrors/rx/RxJava
RxJava 是 JVM 上最流行的响应式编程库(Reactive Extensions),用于组合异步和基于事件的程序。学习 RxJava 时,新手最容易困惑的一个问题就是:项目里的 Flowable、Observable、Single、Maybe、Completable 这 5 大核心类型到底有什么区别?我该选哪一个?本文通过一张对比表和常见场景选型指南,帮你一次性搞懂它们的核心差异。
5大响应式类型一图速览:发射数量决定一切
选择哪种类型,本质上取决于**"这次操作会返回多少个值"**:
| 类型 | 发射数量 | 是否支持背压 | 终止信号 | 一句话定位 |
|---|---|---|---|---|
| Flowable | 0 到 N 个 | ✅ 支持 | 完成 或 错误 | 大数据量异步流 |
| Observable | 0 到 N 个 | ❌ 不支持 | 完成 或 错误 | 经典可观察序列 |
| Single | 恰好 1 个 | ❌ 不支持 | 成功 或 错误(必二选一) | 必然有结果的操作 |
| Maybe | 0 或 1 个 | ❌ 不支持 | 成功 或 完成 或 错误 | 结果不确定的查询 |
| Completable | 0 个 | ❌ 不支持 | 完成 或 错误 | 只关心成败的副作用操作 |
💡 记忆口诀:Flowable/Observable 管"流",Single 管"必有",Maybe 管"未必",Completable 管"没值"。
逐个解析:每种类型适合干什么
Flowable:支持背压的高性能数据流(0..N 个数据)
Flowable遵循 Reactive Streams 规范,最独特的能力是背压(Backpressure)——当下游消费速度跟不上上游生产速度时,上游可以放慢发射,避免内存溢出。它适合大数据量、持续推送的场景,例如:
- 读取大文件分块传输
- 实时行情、消息推送
- 高吞吐量的批量处理
源码见 Flowable.java,背压机制的完整说明可阅读 Backpressure.md 和 Reactive-Streams.md。
Observable:经典的可观察序列(0..N 个数据)
Observable是最早、最经典的核心类型,可发射 0 到 N 个数据,不带背压。对于日常大多数业务场景(点击事件、普通网络请求列表、UI 事件流),它比 Flowable 更轻量、性能更好。详见 Observable.java 与 Observable.md。
⚠️ 选型建议:数据量不大就用Observable;数据量大、生产远快于消费才需要Flowable。
Single:必须且只能有一个结果
Single表示"这次操作必定会返回一个值或抛出错误",二者必居其一,不存在"空结果"。它的协议是onSubscribe → (onSuccess | onError),源码见 Single.java。典型场景:
- 通过 ID 查询一定存在的用户记录
- 登录请求必然返回一个会话 Token
- 文件读取必然得到一个内容(或 IO 错误)
如果"查不到"也合法,Single 就会抛错误——这时你该用 Maybe。
Maybe:结果不确定,0 个或 1 个都行
Maybe是 Single 的"宽容版":可能成功返回 1 个值,也可能什么都不返回直接完成(onSubscribe → (onSuccess | onComplete | onError))。源码见 Maybe.java。典型场景:
- 查询可能不存在的缓存项
- 判断"当前是否有未读消息"(有就发,没有就完事)
- 按条件查找单条记录,查不到属正常情况
Completable:只关心成功或失败,不关心数据
Completable不发射任何值,只发出"完成"或"错误"两种信号,源码见 Completable.java。典型场景:
- 数据删除、刷新、写日志等副作用操作
- 后台同步任务"跑完就行"
- 组合流程中只需要"上一步成功了没"这个信号
常见场景选型速查表
| 你的场景 | 该选谁 | 理由 |
|---|---|---|
| 加载列表页数据 | 📋 Observable | 多条数据,量不大 |
| 实时视频/传感器高频数据 | ⚡ Flowable | 需要背压保护下游 |
| 用 ID 查必存在的订单 | 🎯 Single | 必有结果,没有就异常 |
| 查缓存,可能未命中 | 🎲 Maybe | 0 或 1 都合法 |
| 提交表单后刷新 UI 状态 | 🏁 Completable | 只要成败信号 |
| 定时轮询、事件监听 | 🔁 Observable | 持续 0..N 事件 |
5种类型可以互相转换,不用纠结太深
它们之间可以无缝互转,选错了也没关系:
Single/Maybe→Observable/Flowable:toObservable()、toFlowable()Observable/Flowable→Single:firstElement()、singleOrError()Observable/Flowable→Completable:ignoreElements()- 任何类型 →
Completable:ignoreElements()忽略所有数据只留终止信号
所以实用策略是:先按语义选一个最贴近的类型,跑起来后再按需转换。
新手最常见的 3 个误区
- 一律用 Observable 打天下—— 确实能跑通,但"必然有结果"的接口用 Maybe/Single 建模,能让"查不到该报错"的约束显式化,代码更健壮。
- 以为背压是默认能力—— 只有 Flowable 支持背压,Observable 消费不过来就会堆积在内存里。
- 混淆 Single 和 Maybe—— 分不清"查不到是 bug"还是"查不到很正常",就分不清该用哪个。
相关源码与官方文档
- 核心类型源码目录:core/(Flowable、Observable、Single、Maybe、Completable 均在此目录)
- 响应式规范背景:Reactive-Streams.md
- 背压机制详解:Backpressure.md
- 各算子矩阵(帮你确认某算子支持哪些类型):Operator-Matrix.md
- 版本差异(2.0 引入 Single/Maybe/Completable 的历史):What's-different-in-2.0.md
总结
记住一张表就够了:看返回值数量定类型—— 0..N 选 Flowable(要背压)或 Observable(轻量常规);恰好 1 选 Single;0 或 1 选 Maybe;0 个只关心成败选 Completable。掌握了这个判断标准,RxJava 的 API 选型就不再是难题。🚀
【免费下载链接】RxJavaRxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.项目地址: https://gitcode.com/gh_mirrors/rx/RxJava
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考