rxJava2在复杂流中组合Single,Maybe,Completable

Ros*_*hak 10 java android rx-java rx-java2

我很高兴能与新RxJava Sources如:Single,Maybe,Completable,,使您接口的类的"源"的创建过程更清洁,防止了很多错误(如忘记调用onComplete())

但它需要大量的样板才能将它们组合成一个复杂的流.

例如,我们有加载和缓存数据的常见Android情况.假设我们有2个来源api,并cache和我们想将其结合:

public interface Api {
    Single<Integer> loadFromNetwork();
}

public interface Cache {
    Maybe<Integer> loadFromCache(); //maybe because cache might not have item.
}
Run Code Online (Sandbox Code Playgroud)

让我们试着把它结合起来:

final Single<Integer> result = cache.loadFromCache()
        .switchIfEmpty(api.loadFromNetwork());
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为Maybe没有重载Maybe.switchIfEmpty(Single):Single

所以我们必须转换一切:

final Single<Integer> result = cache.loadFromCache()
        .switchIfEmpty(api.loadFromNetwork().toMaybe())
        .toSingle();
Run Code Online (Sandbox Code Playgroud)

组合它的另一种可能方法还需要сonversion:

final Single<Integer> result = Observable.concat(
            cache.loadFromCache().toObservable(),
            api.loadFromNetwork().toObservable()
        ).firstOrError();
Run Code Online (Sandbox Code Playgroud)

因此,我没有看到任何使用新源的方法,没有很多转换会增加代码噪声并创建大量额外的对象.

由于这样的问题,我不能使用Single,Maybe,Completable和继续使用Observable无处不在.

所以我的问题是:

  • 什么是相结合的最佳实践Single,Maybe, Completable.

  • 为什么这些Source没有重载来简化梳理.

  • 为什么这些Source没有共同的祖先并将其用作
    参数switchIfEmpty和其他方法?


PS有谁知道为什么这些类没有任何共同的层次结构?
从我的角度来看,如果一些代码可以用于Completable它的例子,它也可以正常使用SingleMaybe

Ros*_*hak 5

2017年9月22日发布的RxJava 2.1.4增加了所需的重载Maybe.switchIfEmpty(Single):Single

因此,当我们想要组合以下类时:

public interface Api {
    Single<Integer> loadFromNetwork();
}

public interface Cache {
    Maybe<Integer> loadFromCache(); //maybe because cache might not have item.
}
Run Code Online (Sandbox Code Playgroud)

我们终于可以做到:

final Single<Integer> result = cache.loadFromCache()
        .switchIfEmpty(api.loadFromNetwork());
Run Code Online (Sandbox Code Playgroud)

RX团队已经通过添加额外的过载来完成的非常出色MaybeSingleObservable,,简化结合在一起。

至于版本2.1.16,我们有以下方法相结合MaybeSingleCompletable

也许flatMapSingleElement(Single):MaybeflatMapSingle(Single):SingleswitchIfEmpty(Single):MaybeflatMapCompletable(Completable):Completable

单人flatMapMaybe(Maybe):MaybeflatMapCompletable(Completable):Completable

CompletableandThen(Single):SingleandThen(Maybe):Maybe