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