RxJava嵌套Observables公开值

时间:2019-11-04 17:48:26

标签: rx-java rx-java2

我有以下代码可以正常工作。但是,我不喜欢blockingGet。有没有一种方法可以将getSingle()调用上移到Observable的“全局”变量中来避免这种情况?换句话说,我希望getSingle在代码继续之前不使用blockingGet来完成。请注意,在map调用中,我需要访问foos,bar和getSingle()响应。

任何帮助将不胜感激!

public List<Baz> example(Single<Collection<Foo>> foosSingle, Collection<Bar> bars) {
  return foosSingle
    .flatMap(foos -> 
      Observable.fromIterable(bars)
        .map(bar -> getBaz(foos, getSingle(bar.getBlah()).blockingGet(), bar.getFlaz())
        .toList()
    );
}

FWIW我尝试将.map调用替换为以下内容:

 .map(bar -> Lists.ArrayList(bar, getSingle(bar.getBlah()).blockingGet())
 .map(list -> getBaz(foos, list.get(1), list.get(0).getFlaz())

这使我可以访问所需的所有变量,但不能解决blockingGet问题。

1 个答案:

答案 0 :(得分:3)

使用.flatMap代替地图

public List<Baz> example(Single<Collection<Foo>> foosSingle, final Collection<Bar> bars) {
  return foosSingle
    .flatMap(foos -> 
      Observable.fromIterable(bars)
        .flatMapSingle(bar -> {
          return getSingle(bar.getBlah())
            .map(x -> getBaz(foos, x, bar.getFlaz()))
        })
        .toList()
    );
}