Stream, RxJava, Reactor之比较
如果你熟悉Java 8,同时又了解反应式编程(Reactive Programming)框架,例如RxJava和Reactor等,你可能会问:
“如果我可以用Java 8 的Stream, CompletableFuture, 以及Optional完成同样的事情,为什么还要用RxJava 或者 Reactor呢?”
原因是:大多数时候你在处理的是简单的任务,这个时候你确实不需要那些反应式编程的库。但是,当系统越来越复杂,或者你处理的本身就是个复杂的任务,你恐怕就得写一些让自己头皮发麻的代码。随着时间的推移,这些代码会变得越来越复杂和难以维护。
RxJava和Reactor提供了很多非常趁手的功能,能够支持你在未来更轻松地维护你的代码,实现新需求。但是这个优势到底有多大,具体体现在哪些方面?没有标准无法比较,让我们定义8个比较的维度,来帮助我们理解Java 8的API以及反应式编程的库之间的差别。
-
Composable ------------(可组装)
-
Lazy ---------------------(延迟执行)
-
Reusable ----------------(可重用)
-
Asynchronous ----------(异步)
-
Cacheable ---------------(可缓存)
-
Push or Pull -------------(推还是拉)
-
Backpressure -----------(反压)
-
Operator fusion --------(操作融合)
针对上面这些维度,我们比较以下的这些类:
CompletableFuture
Stream
Optional
Observable (RxJava 1)
Observable (RxJava 2)
Flowable (RxJava 2)
Flux (Reactor Core)
准备好了吗?我们开始!
Composable(可组装)
上面所有的这7个类都是可组装的,支持函数式的编程方式,这是我们喜欢它们的原因。
CompletableFuture - 提供很多的.then*()方法,这些方法允许我们构建一个流水线,在不同的执行阶段之间传递一个单一的值(或者没有值),以及传递异常对象。
Stream - 提供很多的可以链式编程方式连接起来的操作,不同的操作阶段之间可以传递N个值。
Optional - 提供一些中间操作,如: .map(), .flatMap(), .filter().
Observable, Flowable, Flux - 跟Stream相同