RxJava 2 与 RxJava 3 的主要区别主要体现在 包结构优化、API 调整、功能增强及兼容性改进 上。以下是两者的核心差异点:
1. 包名与依赖变更
包名调整:
RxJava 2:io.reactivex
RxJava 3:io.reactivex.rxjava3
这一改动使得 RxJava 3 与旧版本在代码中共存成为可能(如同时使用 RxJava 2 和 3)。
依赖关系:
RxJava 3 对 Reactive Streams 的依赖更简化,直接内置于核心库,而 RxJava 2 需显式依赖 org.reactivestreams:reactive-streams。
2. API 的改进与新增操作符
操作符调整:
新增操作符:如 startWithItem、startWithIterable、concatMap 支持调度器参数等。
废弃操作符:移除了 replay(Scheduler)、dematerialize() 等。
重命名:as() 合并到 to(),Maybe.defaultIfEmpty() 返回类型改为 Single。
函数式接口调整:
更广泛使用 Supplier 替代 Callable,以增强 Java 8+ 的兼容性。
实验性操作符(如 X.fromSupplier())升级为标准 API。
3. 对空值(null)的严格处理
RxJava 2:明确禁止传递 null 值,若传入会抛出 NullPointerException。
RxJava 3:延续了这一设计,进一步强化了非空约束,避免因空值导致的运行时错误。
4. 背压(Backpressure)支持
RxJava 2:
通过 Flowable 类型支持背压,而 Observable 不支持。
默认的 Observable 在异步场景下可能因背压不足抛出 MissingBackpressureException。
RxJava 3:
优化了 Flowable 的实现,提升背压处理的稳定性和性能。
引入 eagerTruncate 参数到 replay 操作符,减少内存泄漏风险。
5. 线程调度与生命周期管理
线程池优化:
RxJava 3 调整了内部线程池的配置,提升异步任务执行效率。
Android 兼容性:
RxJava 3 尚未完全适配 RxAndroid(截止到 2023 年,RxAndroid 仍主要支持 RxJava 2),需通过适配器桥接。
6. 对 Java 版本的支持
RxJava 2:支持 Java 6+ 和 Android 2.3+。
RxJava 3:
最低要求 Java 8,利用 Lambda 表达式和函数式接口简化代码。
更深度整合 Java 8+ 特性(如 java.util.function 包)。
7. 其他细节差异
Disposable 接口:
RxJava 3 进一步优化了资源释放逻辑,减少内存泄漏风险。
测试支持:
新增对虚拟时间(如 TestScheduler)和诊断工具的增强,便于单元测试。
升级建议
兼容性:RxJava 3 对 RxJava 2 的二进制兼容性较好,但仍需注意包名和 API 变更。
新项目:直接使用 RxJava 3,尤其是需要 Java 8+ 特性的场景。
旧项目迁移:逐步替换包名,利用 IDE 的全局替换功能调整 import 路径,并检查废弃 API 的替代方案。
总结
RxJava 3 在保持与 RxJava 2 高度兼容的同时,通过 包结构调整、API 优化、性能提升 进一步简化了响应式编程的复杂性。对于依赖现代 Java 特性的项目,升级到 RxJava 3 是更优选择149。如需更详细的迁移指南,可参考官方文档或相关技术博客。