Каков наиболее эффективный способ объединения множества Single <List <Type>> в один <List <Type>>? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть функция loadApplesById, которая принимает AppleId и возвращает Single<List<Apple>>.

В другой функции, loadApplesByIdList Я принимаю List<AppleId> в качестве параметра. И для каждого элемента в нем я должен назвать loadApplesById. loadApplesByIdList также вернет Single<List<Apple>>.

Примерно так:

Single<List<Apple> loadApplesById(AppleId appleId)
{
    // magic to create and load the apple list.
    return the Single.just(AppleList);
}


Single<List<Apple> loadApplesByIdList(List<AppleId> appleIdList)
{
    // My question how to create this function (?)
    // Approach (1)
    return Observable.from(appleIdList).flatMap(
        appleId -> this.loadApplesById(id)
        .toObservable())
        .reduce(new ArrayList<>(), (List<Apple> a, List<Apple> b)
            -> { a.addAll(b); return a; }).toSingle();

    // Approach (2)
    return Observable.from(appleIdList).flatMap(appleId -> loadApplesById(id)
            .toObservable())
            .toSingle();

}

Хотя оба эти подхода компилируются, ни один из них не работает.

Было бы отличным уроком для обучения, если бы кто-то потратил время на то, чтобы рассказать о различных способах достижения этой цели (со сложением, уменьшением, flatMap, concatMap) и т. Д.

1 Ответ

0 голосов
/ 01 ноября 2018

Вы должны развернуть каждый из них, объединить их, а затем собрать их снова:

Single<List<Apple>> allApples = 
    Observable.fromIterable(appleIdList)
    .concatMap(appleId -> 
         loadApplesById(appleId)
         .flattenAsObservable(list -> list)
    )
    .toList();

Для этого вам понадобится RxJava 2.

...