RxJava API 和 Java 9 Flow API 之间的区别

2022-08-31 13:38:55

似乎在最近几个主要版本的Java的每个迭代中,都有一致的新方法来管理并发任务。

在Java 9中,我们有Flow API,它类似于RxJava的Flowable API,但Java 9有一组更简单的类和接口。

Java 9

有一个 、 、 、 和 ,仅此而已。Flow.PublisherFlow.SubscriberFlow.ProcessorFlow.SubscriptionSubmissionPublisher

RxJava

具有整个类似 Flow API 的类,即 、 、 、 和 似乎执行类似操作。io.reactivex.flowablesio.reactivex.subscribersio.reactivex.processorsio.reactivex.observersio.reactivex.observables

这两个库之间的主要区别是什么?为什么有人会使用Java 9 Flow库而不是更多样化的RxJava库,反之亦然?


答案 1

这两个库之间的主要区别是什么?

Java 9 Flow API 不是一个独立的库,而是 Java 标准版库的一个组件,由 2015 年初制定的 Reactive Streams 规范中采用的 4 个接口组成。从理论上讲,它的包含可以启用JDK中特定的用法,例如孵化的HttpClient,也许是计划中的异步数据库连接,当然还有。SubmissionPublisher

RxJava 是 Java 库,它使用 ReactiveX 样式的 API 设计在反应式(推送)数据流上提供一组丰富的运算符。版本 2,通过和各种 s,实现了反应流 API,该 API 允许其他兼容库使用 的实例,反过来,人们可以将任何实例包装成一个来使用它们并用它们组成丰富的运算符集。FlowableXxxProcessorFlowablePublisherFlowable

因此,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,而只能通过桥接。这种桥接也是其他基于反应式流的库需要和/或提供的。

RxJava 3可能面向Java 9 Flow API,但这尚未确定,并且根据后续Java版本带来的功能(即值类型),我们可能在一年左右的时间内没有v3。

在那之前,有一个名为Reactive4JavaFlow的原型库,它确实实现了Flow API,并在其上提供了ActiveX风格的丰富流畅的API。

为什么有人会使用Java 9 Flow库而不是更多样化的RxJava库,反之亦然?

流 API 是互操作规范,而不是最终用户 API。通常,您不会直接使用它,而是将流传递给它的各种实现。在讨论JEP 266时,作者没有发现任何现有库的API足够好,以至于Flow API具有默认值(与富库不同)。因此,决定用户现在必须依赖第三方实现。java.util.Stream

您必须等待现有的反应式库通过它们自己的桥实现或要实现的新库以本机方式支持 Flow API。

通过 Flow API 提供一组丰富的运算符是库实现它的唯一原因。数据源供应商(即反应式数据库驱动程序,网络库)可以通过Flow API开始实现自己的数据访问器,并依靠丰富的库来包装它们并为它们提供转换和协调,而不会强迫每个人实现各种这些运算符。

因此,一个更好的问题是,您是立即开始使用基于 Flow API 的互操作,还是坚持使用反应式流?

如果您需要相对较快的工作和可靠的解决方案,我建议您现在坚持使用Reactive Streams生态系统。如果您有足够的时间或想要探索事物,则可以开始使用 Flow API。


答案 2

一开始,有Rx,版本一。它是反应式API的语言不可知规范,具有Java,JavaScript,.NET的实现。然后他们改进了它,我们看到了Rx 2。它还具有不同语言的实现。在Rx 2 Spring成立之时,团队正在开发Reacher——他们自己的一套反应式API。

然后他们都想:为什么不共同努力,创建一个API来统治他们所有人。这就是Reactive Commons的建立方式。一项联合研究工作,旨在构建高度优化的反应流兼容运算符。目前的实现者包括RxJava2和Reacher。

与此同时,JDK开发人员意识到,反应式的东西很棒,值得包含在Java中。在Java世界中,事实上的标准成为法律上的标准。Remeber Hibernate 和 JPA、Joda Time 和 Java 8 Date/Time API?因此,JDK开发人员所做的是提取反应式API的核心,这是最基本的部分,并使其成为标准。这就是诞生的方式。j.u.c.Flow

从技术上讲,它要简单得多,它仅由四个简单的接口组成,而其他库则提供了数十个类和数百个运算符。j.u.c.Flow

我希望,这回答了“它们之间有什么区别”的问题。

为什么有人会选择Rx?好吧,因为现在它是一个标准!j.u.c.Flow

目前,JDK只附带了一个HTTP/2 API的实现。它实际上是一个孵化的API。但在未来,我们可能会期望 Reactor、RxJava 2 以及其他库(如反应式数据库驱动程序甚至 FS IO)支持它。j.u.c.Flow


推荐