如何执行对observable返回的列表的每个元素返回单个值并将其作为列表返回的操作?

时间:2018-10-05 10:42:45

标签: rx-java2

这个问题很复杂,但是在代码中看起来更简单了(我希望如此)

我有类似波纹管的功能

fun trackFoos(): Observable<List<Foo>> {/*....*/}
fun getBarForFoo(fooState: Foo.State): Single<Bar>

而且我有一些绑定到应用程序其他部分的代码,所以我不能对其进行太多更改。

Observable.combineLatest(
              trackFoos(),
              Observable.interval(1, TimeUnit.SECONDS),
              BiFunction() {foos: List<Foo>, _:Long -> foos}
             ).subscribe { foos -> /*....*/ }

现在我需要使用此getBarForFoo

为每个foo对象传递Bar对象

因此,我需要使用trackPairOfFooAndBar()trackFoos()来编写getBarForFoo(),如下所述:

Observable.combineLatest(
              trackPairOfFooAndBar(),
              Observable.interval(1, TimeUnit.SECONDS),
              BiFunction() {fooBarList: List<Pair<Foo,Bar>>, _:Long -> fooBarList}
             ).subscribe { fooBarList-> /*....*/ }

我看到了这个答案:https://stackoverflow.com/a/47676208/1461568,但是假设可以观察到第二个电话(我有一个电话)

那怎么办?

1 个答案:

答案 0 :(得分:0)

您可以这样做:

  1. trackFoos()Observable<List<Foo>>转换为Observable<Foo>
  2. 对于每个Foo,请执行getBarForFoo()并映射结果,使其真正返回Pair<Foo, Bar>
  3. (可选)如果您需要Single<List<Pair<Foo,Bar>>>,可以致电toList()
  4. (可选)如果您确实需要Observable,则可以致电toObservable()

在代码中:

fun trackPairOfFooAndBar() : Observable<Pair<Foo, Bar>> {
    return trackFoos()            
            .flatMapIterable { it } // or flatMap {list -> Observable.fromIterable(list)}
            .flatMapSingle { foo -> getBarForFoo(foo.state).map { foo to it } }
            // optional, depending what is the final signature that you want
            //.toList().toObservable 
}