2016-09-30 48 views
0

我有一個從服務器獲得的類A的對象列表。除了其他項目之外,這個類別A還包含一個ID列表。然後這些ID是用於檢索B類在RxJava中組合父級詳細請求

的對象的名單上有到位返回

Observable<List<A>> 

Observable<B> 

功能。

我想使用RxJava檢索A對象列表,然後檢索每個A對象的B對象列表,並將B對象分配給它們屬於的A對象,所以我想最終與此類似一些複合對象的列表:

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

,並返回

Observable<List<Details>> 

謝謝!

回答

2

假設,正如你所說,你具備的功能:

Observable<List<A>> getAList() 

Observable<B> getB(Long id) 

基本上你需要利用Observable.from方法的去耦列表單元素,當然Observable.flatMap來變換Observable's。

創建一個輔助函數從A的名單得到B名單:

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(); 

} 
+0

真棒,謝謝!那zipWith是關鍵。 – Francesc