在RxJava

时间:2016-09-30 03:51:48

标签: android rx-java

我有一个从服务器获得的A类对象列表。除了其他项目之外,该A类还包含ID列表。然后使用这些ID来检索B类对象的列表。

我有返回的函数

Observable<List<A>>

Observable<B>

到位。

我想使用RxJava检索A对象列表,然后检索每个A对象的B对象列表,并将B对象分配给它们所属的A对象,所以我想最终得到一个类似于此的复合对象的列表:

class Details {
    public A a;
    public List<B> listOfB;
}

并返回

Observable<List<Details>>

谢谢!

1 个答案:

答案 0 :(得分:2)

如您所述,假设您具有以下功能:

Observable<List<A>> getAList()

Observable<B> getB(Long id)

基本上,您需要使用Observable.from方法将列表解耦为单个元素,当然Observable.flatMap来转换Observable&#39>。

创建帮助函数以从B列表中获取A列表:

public Observable<List<B>> getBFromAList(List<Long> idList) {
    return Observable.from(idList)
            .flatMap(new Func1<Long, Observable<B>>() {
                @Override
                public Observable<B> call(Long id) {
                    return getB(id);
                }
            })
            .toList();
}

和主要功能:

public Observable<List<Details>> getDetailsList() {
    return getAList()
            .flatMap(new Func1<List<A>, Observable<A>>() {
                @Override
                public Observable<A> call(List<A> aList) {
                    return Observable.from(aList);
                }
            }).flatMap(new Func1<A, Observable<Details>>() {
                @Override
                public Observable<Details> call(A a) {
                    return getBFromAList(a.idList)
                            .zipWith(Observable.just(a), new Func2<List<B>, A, Details>() {
                                @Override
                                public Details call(List<B> bs, A a) {
                                    Details details = new Details();
                                    details.a = a;
                                    details.listOfB = bs;
                                    return details;
                                }
                            });
                }
            }).toList();

}