将许多Single <list <type >>组合成一个Single <list <type >>的最有效方法是什么?

时间:2018-10-31 22:10:58

标签: java multithreading rx-java reactive-programming

我有一个函数loadApplesById,它接受​​一个AppleId并返回一个Single<List<Apple>>

在另一个函数中,loadApplesByIdList我接受List<AppleId>作为参数。对于其中的每个元素,我都必须调用loadApplesByIdloadApplesByIdList也将返回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();

}

虽然这两种方法都可以编译,但是它们都不起作用。

如果有人花时间详细说明可以实现此目标的不同方式(使用fold,reduce,flatMap,concatMap等),那将是一个很棒的学习课程。

1 个答案:

答案 0 :(得分:1)

您必须展开每个单身,将它们连接起来,然后再次收集它们:

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

尽管如此,您将需要RxJava 2。