如何链接可观察物?

时间:2020-07-04 19:47:36

标签: java kotlin rx-java reactive-programming reactivex

我需要链接两个可观察变量,第二个依赖于第一个。 所以我有:

Observable 1->请愿返回Observable

//kotlin
fun getTvShow(): Observable<TvShow> {
    return retrofitPetitionGetShow()...
}
//java
Observable<TvShow> getTvShow(){
    return retrofitPetitionGetShow()...
}

Observable 2->返回Single >

Observable.range(1, TvShow.totalSeasons)
            .flatMap { seasonNumber: Int ->
                retrofitPetitionGetSeason(seasonNumber)....
            }.toList()  

我需要的是将第二个可观察到的结果(List )添加到TvShow对象TvShow.setList(List<Season>)中,然后将其返回。

提前谢谢

1 个答案:

答案 0 :(得分:1)

基于注释中提供的信息,您可以尝试使用以下代码(它是Java代码,但是将其转换为Kotlin应该很容易):

private Observable<TvShow> getTvShow() {
    return retrofitPetitionGetShow();
}

private Single<List<Season>> getSeasons(TvShow tvShow) {
    return Observable.range(1, tvShow.getTotalSeasons())
            .flatMap(seasonNumber -> retrofitPetitionGetSeason(seasonNumber))
            .toList();
}

public Observable<TvShow> chainObservables() {
    return getTvShow()
            .flatMap(tvShow -> getSeasons(tvShow).map(tvShow::withSeasons).toObservable());
}

重要!

以反应/功能方式,您不应修改对象,而应创建新对象(在您的情况下,将tvShow更新为带有季节列表)。有一个tvShow::withSeasons方法参考以这种方式实现:

public TvShow withSeasons(List<Season> seasons) {
        return this.seasons == seasons ? this : new TvShow(this.name, this.totalSeasons, seasons);
    }
相关问题