2016-09-30 4 views
0

У меня есть список объектов класса A, которые я получаю с сервера. Этот класс A содержит среди других элементов список идентификаторов. Эти идентификаторы затем используются для получения списка объектов класса В.Сочетание запросов родительских деталей в RxJava

У меня есть функции, которые возвращают

Observable<List<A>> 

и

Observable<B> 

на месте.

Я хотел бы использовать RxJava для извлечения списка объектов A, затем получить список объектов B для каждого объекта A и назначить объекты B объекту, к которому они принадлежат, поэтому я хотел бы закончить с Перечнем некоторых составного объекта, аналогичного этому:

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.

Создайте вспомогательную функцию, чтобы получить список B из списка A «s:

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

Awesome, спасибо! Это ключ от zipWith. – Francesc

Смежные вопросы