这两个库有什么主要区别?
Java 9 Flow API不是一个独立的库,而是Java标准版库的一个组件,由4个接口组成,这些接口采用了早在2015年初制定的
Reactive Streams规范。理论上,它的包含可以实现JDK特定的用法,例如孵化中的HttpClient、部分计划中的Async Database Connection,以及
SubmissionPublisher
。
RxJava是一个使用ReactiveX风格API设计的Java库,提供了一组丰富的操作符来处理反应式(推送)数据流。通过
Flowable
和各种
XxxProcessor
,版本2实现了Reactive Streams API,允许其他兼容库消费
Flowable
的实例,并将任何
Publisher
包装成
Flowable
以消费它们并与其组合丰富的操作符集。
因此,Reactive Streams API是最小的接口规范,而RxJava 2是其中的一种实现,加上RxJava声明了大量附加方法,形成了自己丰富和流畅的API。
RxJava 1的灵感来源包括反应式流规范,但无法利用它(必须保持兼容)。 RxJava 2是一次完全重写和单独的主版本,可以采用并使用反应式流规范(甚至通过
Rsc项目在内部扩展),并且比Java 9发布了近一年。此外,决定同时支持Java 6的v1和v2,因此有很多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
不同)。因此,决定目前用户必须依赖第三方实现。
您必须等待现有的响应式库本地支持Flow API,通过它们自己的桥接实现或实现新的库。
只有提供丰富的运算符集才是库实现Flow API的唯一原因。数据源供应商(即,响应式数据库驱动程序、网络库)可以通过Flow API开始实现自己的数据访问者,并依赖于丰富的库来包装它们并为它们提供转换和协调,而不强制所有人实现所有这些运算符。
因此,更好的问题是,现在是否应该开始使用基于Flow API的互操作性,还是坚持使用Reactive Streams?
如果您需要相对较快地获得可靠的解决方案,我建议您暂时坚持使用Reactive Streams生态系统。如果您有充足的时间或想要探索一些东西,那么您可以开始使用Flow API。