RxJava1和RxJava2之间的差异

时间:2016-07-17 15:50:47

标签: java java-8 rx-java

我一直在查看RxJava1 https://github.com/ReactiveX/RxJava/releases和RxJava2 https://github.com/ReactiveX/RxJava/wiki/Reactive-Streams的文档,看起来唯一不同的是RxJava 2有Java Stream。

还有其他不同吗?。

我一直在使用1.1.3版本,但由于我们已经在代码中使用了Java 8流,因此我不确定它是否值得转移到RxJava2

问候。

3 个答案:

答案 0 :(得分:23)

RxJava 1.x和2.x都设计为Java 6+,因此我们无法在任何版本中支持Java 8 Streams。决定继续支持无数的Android设备和版本,这些设备和版本不会更新到兼容Java 8的运行时。如果您需要Java 8支持,请考虑使用Pivotal中的Reactor-Core

两者之间的主要区别在于2.x直接针对Reactive-Streams SPI,为此,它已经从头开始完全重写。我们目前处于开发预览模式,您可以按照2.x branch readme

中的说明进行访问

完全重写2.x大大提高了我们的内存消耗和性能; here is a benchmark比较各种版本和库。

在API表面上,我们计划继续支持1.x中存在的所有运算符,并且可能会在新的数据库中使用新的运算符延长几年,然后才能支持1.x.

由于2.x是一种新架构,因此必须更新许多依赖库(例如,Retrofit);这可能不会在今年8月底之前发生,也可能需要几个月才能赶上。 Here is the wiki page包含差异的亮点。

答案 1 :(得分:18)

我在my sample project - link

中实施了 RxJava2

以下RxJava2和RxJava1之间的区别:

  1. 为了允许RxJava 1.x和RxJava 2.x并排,RxJava 2.x位于maven坐标io.reactivex.rxjava2:rxjava:2.x.y下,类可以在io.reactivex下方访问。< / p>

  2. 从1.x切换到2.x的用户必须重新组织他们的导入,但要小心。

  3. onCompleted - &gt; onComplete - 没有尾随d

  4. CompositeSubscription - &gt;已移除CompositeDisposable - CompositeDisposable CompositeSubscriptionSubscription

  5. Func1 - &gt; Function

  6. Func2 - &gt; BiFunction

  7. limit运算符已被删除 - 在RxJava2中使用take

  8. RxJava 2.0已在Reactive-Streams规范之上从头开始完全重写。规范本身已经从RxJava 1.x发展而来,为反应系统和库提供了一个共同的基线。

    由于Reactive-Streams具有不同的体系结构,因此它要求对一些众所周知的RxJava类型进行更改。

    与RxJava1相比,RxJava2具有更好的性能低内存使用率

    [来源: https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0]

答案 2 :(得分:2)

其中一个主要差异适用于.filter运算符。正如文档中所述:

  

此外,需要谓词的运算符不再使用Func1<T, Boolean>,而是具有单独的原始返回类型Predicate<T>   (由于没有自动装箱,允许更好的内联)。

因此对于.filter运算符,您需要像下面的示例一样进行更改

        RxTextView.textChanges(editText)
            .debounce(400, TimeUnit.MILLISECONDS)
            .filter(new Predicate<CharSequence>() {
                @Override
                public boolean lengthOk(CharSequence charSequence) {
                    return charSequence.length() > 3;
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(/* attach your observer */);