好的,我认为这应该可以解决您问题的第一部分:
请注意,对flatMap 的第二次调用有两个参数——flatMap 的一个版本不仅为每个输入项生成一个 Observable,而且还采用第二个函数,该函数反过来将组合来自结果 Observable 与相应的输入项。
查看此标题下的第三张图以直观了解:
https://github.com/ReactiveX/RxJava/wiki/Transforming-Observables#flatmap-concatmap-and-flatmapiterable
Observable<A> obeservableOfAs = retrofitClient.getListOfAs()
.flatMap(new Func1<List<A>, Observable<A>>() {
@Override
public Observable<A> call(List<A> listOfAs) {
return Observable.from(listOfAs);
}
)}
.flatMap(new Func1<A, Observable<AA>>() {
@Override
public Observable<AA> call(A someA) {
return retrofitClient.getTheAaForMyA(someA);
}
},
new Func2<A, AA, A>() {
@Override
public A call(A someA, AA theAaforMyA) {
return someA.set(theAaforMyA);
}
})
...
从这里开始,我仍然不确定你想如何继续:你准备好订阅生成的 As 的 Observable 了吗?这样您就可以处理每个 As (onNext) 或等到所有操作都完成 (onCompleted)。
附录:最后要将所有项目收集到一个列表中,即将您的Observable<A> 转换为Observable<List<A>> 使用toList()。
https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#tolist
所以你有:
Observable<List<A>> observableOfListOfAs = observableOfAs.toList();
如果您需要对列表的构建进行更细粒度的控制,也可以使用reduce。
https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#reduce
对于 B,只需复制您用于 As 的整个流程。
然后您可以使用zip 等待两个流程完成:
Observable.zip(
observableOfListOfAs,
observableOfListOfBs,
new Func2<List<A>, List<B>, MyPairOfLists>() {
@Override
public MyPairOfLists call(List<A> as, List<B> bs) {
return new MyPairOfLists(as, bs);
}
}
)
.subscribe(new Subscriber<MyPairOfLists>() {
// onError() and onCompleted() are omitted here
@Override
public void onNext(MyPairOfLists pair) {
// now both the as and the bs are ready to use:
List<A> as = pair.getAs();
List<B> bs = pair.getBs();
// do something here!
}
});
我想你可以猜到MyPairOfLists的定义。