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

标签 java rx-java rx-java2 java-9

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

在 Java 9 中,我们有 Flow API类似于 Flowable API RxJava 的版本,但 Java 9 的类和接口(interface)要简单得多。

Java 9

拥有 Flow.PublisherFlow.SubscriberFlow.ProcessorFlow.SubscriptionSubmissionPublisher,就是这样。

RxJava

拥有Flow API 的整个 -like 类,即 io.reactivex.flowablesio.reactivex.subscribersio.reactivex.processorsio.reactivex .observersio.reactivex.observables 似乎做了类似的事情。

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

最佳答案

What are the main differences between these two libraries?

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

RxJava 是一个 Java 库,它使用 ReactiveX 风格的 API 设计来为响应式(Reactive)(推送)数据流提供一组丰富的运算符。版本 2,通过 Flowable 和各种 XxxProcessor 实现了响应式(Reactive)流 API,它允许 Flowable 的实例被其他兼容库和在turn one 可以将任何 Publisher 包装成一个 Flowable 以使用它们并用它们组成丰富的运算符集。

所以 Reactive Streams API 是最小的接口(interface)规范,而 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。

到那时,有一个原型(prototype)库叫做 Reactive4JavaFlow它确实实现了 Flow API,并在其上提供了 ReactiveX 风格的丰富流式 API。

Why would someone use the Java 9 Flow library over the much more diverse RxJava library or vice versa?

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。

关于java - RxJava API 和 Java 9 Flow API 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354837/

相关文章:

java.util.Timer - 如何正确使用?

java - 在 Mac 上安装 Jmagick-6.6.9 未生成 .dylib

java - 使用多线程 RxJava 的响应式(Reactive)拉取

java - 如何将可变参数传递给观察者?

java - 在java中执行jar文件

java - 为什么java中的html不起作用?

android - 如何在 RxJava 中使用长处理任务对事件流进行去抖动

java - 为此方法编写单元测试用例返回 RxJava Future

android - Rx Java - 只有创建 View 层次结构的原始线程

kotlin - 使用 RxJava 构建 MVI 循环 : how to replace BehaviorSubject with scan()