"Присоединиться" список наблюдаемых в RxJava

133
14

Я перечитываю документацию снова и снова и не могу найти подходящего оператора для своего случая:

 return Observable.fromIterable(formIds)
.flatMap(new Function<String, Observable<List<Transmission>>>() {
@Override
public Observable<List<Transmission>> apply(String formId) {
return getFormTransmissions(formId);
}
})
.toList()
.toObservable()
.map(new Function<List<List<Transmission>>, List<Transmission>>() {
@Override
public List<Transmission> apply(List<List<Transmission>> lists) {
List<Transmission> transmissions = new ArrayList<>();
for (List<Transmission> transmissionList : lists) {
if (transmissionList != null) {
transmissions.addAll(transmissionList);
}
}
return transmissions;
}
});

Как вы можете видеть последнюю карту(), я беру все наблюдаемые и объединяю их содержимое. Мне не нравится эта часть, так как я чувствую, что для этого должна быть какая-то функция rxjava, но я не могу ее найти.

Я попытаюсь объяснить, что делает код: Из списка идентификаторов. Для каждого из них получите список передач для каждого идентификатора. После того, как все они завершены, объедините все отдельные списки передач в один. Есть идеи?

спросил(а) 2021-01-25T19:16:26+03:00 5 месяцев назад
1
Решение
116

Так что в основном вам нужна простая карта, которая может сгладить результат. Вы можете сделать это с flatMapIterable

return Observable.fromIterable(formIds)
.flatMap(new Function<String, Observable<List<Transmission>>>() {
@Override
public Observable<List<Transmission>> apply(String formId) {
return getFormTransmissions(formId);
}
}) // Observable<List<Transmission>>
.flatMapIterable(new Function<List<Transmission>, List<Transmission>>() {
@Override
public List<Transmission> apply(List<Transmission> list) {
return list;
}
}) // Observable<Transmission>
.toList() // Single<List<Transmission>>
.toObservable(); // Observable<List<Transmission>>

Еще проще с функциями Java 8:

return Observable.fromIterable(formIds)
.flatMap(formId -> getFormTransmissions(formId)) // Observable<List<Transmission>>
.flatMapIterable(list -> list) // Observable<Transmission>
.toList() // Single<List<Transmission>>
.toObservable(); // Observable<List<Transmission>>

В качестве альтернативы вы можете просто использовать flatMap в Java Stream:

return Observable.fromIterable(formIds)
.flatMap(formId -> getFormTransmissions(formId)) // Observable<List<Transmission>>
.toList() // Single<List<List<Transmission>>>
.toObservable() // Observable<List<List<Transmission>>>
.map(listOfList -> listOfList.stream().flatMap(Collection::stream)
.collect(Collectors.toList())); // Observable<List<Transmission>>

ответил(а) 2021-01-25T19:16:26+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема