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

2024-02-11

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

在 Java 9 中,我们有Flow API https://docs.oracle.com/javase/9/docs/api/index.html?java/util/concurrent/Flow.html这类似于可流动的API http://reactivex.io/RxJava/javadoc/index.html?io/reactivex/Flowable.htmlRxJava 但 Java 9 有一组更简单的类和接口。

Java 9

Has a Flow.Publisher, Flow.Subscriber, Flow.Processor, Flow.Subscription, and SubmissionPublisher,仅此而已。

RxJava

有完整的packages of Flow API https://docs.oracle.com/javase/9/docs/api/index.html?java/util/concurrent/Flow.html-类类,即io.reactivex.flowables, io.reactivex.subscribers, io.reactivex.processors, io.reactivex.observers, and io.reactivex.observables这似乎做了类似的事情。

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


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

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和各种XxxProcessors,实现了 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxJava API 和 Java 9 Flow API 之间的区别 的相关文章

  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat

随机推荐