这个问题很复杂,但是在代码中看起来更简单了(我希望如此)
我有类似波纹管的功能
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
因此,我需要使用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,但是假设可以观察到第二个电话(我有一个电话)
那怎么办?
答案 0 :(得分:0)
您可以这样做:
trackFoos()
从Observable<List<Foo>>
转换为Observable<Foo>
Foo
,请执行getBarForFoo()
并映射结果,使其真正返回Pair<Foo, Bar>
Single<List<Pair<Foo,Bar>>>
,可以致电toList()
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
}