这两个库的主要区别是什么?
Java 9 Flow API 不是一个独立的库,而是 Java 标准版库的一个组件,由 2015 年初制定的 Reactive Streams 规范采用的 4 个接口组成。理论上,它的包含可以启用特定于 JDK 的使用,例如孵化的 HttpClient,可能是计划中的异步数据库连接,当然还有SubmissionPublisher。
RxJava 是一个 Java 库,它使用 ReactiveX 风格的 API 设计来为反应式(推送)数据流提供一组丰富的运算符。版本 2,通过 Flowable 和各种 XxxProcessors,实现了反应式流 API,它允许 Flowable 的实例被其他兼容库使用,然后可以将任何 Publisher 包装到 Flowable 中使用并与它们组成丰富的运算符集。
所以 Reactive Streams API 是最小的接口规范,而 RxJava 2 是它的一个实现,另外 RxJava 声明了一大组附加方法来形成一个丰富且自己的流利的API。
RxJava 1 在其他来源中启发了 Reactive Streams 规范,但无法利用它(必须保持兼容)。 RxJava 2,作为一个完全重写和一个独立的主版本,可以接受和使用 Reactive Streams 规范(甚至在内部扩展它,感谢Rsc 项目)并且在 Java 9 之前发布了将近一年。此外,决定 v1 和 v2 都继续支持 Java 6,因此支持很多 Android 运行时。因此它不能直接利用 Java 9 现在直接提供的 Flow API,只能通过bridge。其他基于 Reactive Streams 的库也需要和/或提供这种桥接器。
RxJava 3 可能以 Java 9 Flow API 为目标,但这还没有决定,并且取决于后续 Java 版本带来的特性(即值类型),我们可能在一年左右的时间内没有 v3。
到那时,有一个名为 Reactive4JavaFlow 的原型库确实实现了 Flow API,并在其上提供了 ReactiveX 风格的丰富流式 API。
为什么有人会使用 Java 9 Flow 库而不是更多样化的 RxJava 库,反之亦然?
Flow API 是一种互操作规范,而不是最终用户 API。通常,您不会直接使用它,而是将流传递给它的各种实现。在讨论 JEP 266 时,作者没有发现任何现有库的 API 都足以让 Flow API 有一些默认设置(与丰富的 java.util.Stream 不同)。因此,决定用户现在必须依赖 3rd 方实现。
您必须等待现有的响应式库通过它们自己的桥接实现或要实现的新库来原生支持 Flow API。
通过 Flow API 提供一组丰富的运算符是库实现它的唯一原因。数据源供应商(即响应式数据库驱动程序、网络库)可以开始通过 Flow API 实现他们自己的数据访问器,并依靠丰富的库来包装它们并为它们提供转换和协调,而无需强迫每个人都实现各种这些操作符.
因此,一个更好的问题是,您现在应该开始使用基于 Flow API 的互操作还是坚持使用 Reactive Streams?
如果您需要相对较快的工作和可靠的解决方案,我建议您现在坚持使用 Reactive Streams 生态系统。如果你有足够的时间或者想探索一些东西,你可以开始使用 Flow API。