gpt4 book ai didi

java - rxJava2 在复杂流中组合单一的、可能的、可完成的

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:41 25 4
gpt4 key购买 nike

我对新的 RxJava Sources 感到非常兴奋,例如:SingleMaybeCompletable,它们使您的接口(interface)类更清晰,并防止在创建“源”期间出现很多错误(例如,忘记调用 onComplete())

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

例如我们有加载和缓存数据的常见 Android 情况。假设我们有 2 个源 apicache,我们想将它们结合起来:

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

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

让我们尝试结合它:

final Single<Integer> result = cache.loadFromCache()
.switchIfEmpty(api.loadFromNetwork());

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

所以我们必须转换一切:

final Single<Integer> result = cache.loadFromCache()
.switchIfEmpty(api.loadFromNetwork().toMaybe())
.toSingle();

另一种可能的组合方式也需要 сonversion:

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

因此,如果不进行许多会增加代码噪音并创建大量额外对象的转换,我看不出有任何方法可以使用新源。

由于这样的问题,我无法使用SingleMaybeCompletable,继续使用Observable 无处不在。

所以我的问题是:

  • 结合SingleMaybe可完成

  • 为什么这些 Sources 没有重载来简化梳理。

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


附言有谁知道为什么这些类没有任何共同的层次结构?
从我的角度来看,如果某些代码可以与 Completable 一起工作,那么它也可以与 SingleMaybe 一起工作?

最佳答案

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

所以如果我们想合并以下类:

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

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

我们终于可以做到:

final Single<Integer> result = cache.loadFromCache()
.switchIfEmpty(api.loadFromNetwork());

Rx 团队通过向 MaybeSingleObservable 添加额外的重载来完成出色的工作,这简化了它们的组合。

至于发布2.1.16我们有以下方法来组合 MaybeSingleCompletable:

可能:flatMapSingleElement(Single):可能, flatMapSingle(Single):Single, switchIfEmpty(Single):可能, flatMapCompletable(Completable):Completable

单一:flatMapMaybe(Maybe):Maybe, flatMapCompletable(Completable):Completable

可完成:andThen(Single):Single, andThen(Maybe):Maybe

关于java - rxJava2 在复杂流中组合单一的、可能的、可完成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com