«Присоединиться» список наблюдаемых в RxJava - PullRequest
0 голосов
/ 02 февраля 2019

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

 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, но я не могу ее найти.

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

1 Ответ

0 голосов
/ 03 февраля 2019

Таким образом, вам нужна простая карта , которая может сгладить результат.Вы можете сделать это с 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:

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>>
...