RxJava:并行执行Single列表,并以相同的顺序将结果放入列表中

时间:2018-02-24 16:19:37

标签: rx-java rx-java2

我有一个要执行的网络调用列表(它们返回Single<Item>),我想并行执行它们。所有来电成功后,我希望获得List<Item>,其顺序与List<Single<Item>>相同。

我已经设法做到并且它有效,但它似乎有点太复杂了,我猜测必须有一个更简单的方法,因为这似乎是一个非常常见的用例?

这就是我的所作所为:

    List<Single<Pair<Item, Integer>>> itemSingles = new ArrayList<>();
    for (int index = 0; index < itemCount - 1; index++) {
        int finalIndex = index;
        itemSingles.add(
                fetchItem(...)
                .map(item -> new Pair<>(item, finalIndex))
        );
    }

    Single.merge(itemSingles)
            .sorted((o1, o2) -> o1.second.compareTo(o2.second))
            .map(itemPair -> itemPair.first)
            .toList()
            .subscribe(items -> { ... });

正如您所看到的,我必须使用Pair<Item, Integer>将每个项目与其位置绑定,然后我可以使用该位置进行排序。

任何更简单的方式?

1 个答案:

答案 0 :(得分:6)

使用concatMapEager()

 Flowable.range(0, itemCount)
     .concatMapEager(index -> 
         fetchItem(index)
         .subscribeOn(Schedulers.io())
         .toFlowable(),
         /* max parallel executions: */ 8,
         /* items expected per source: */ 1
     )
     .toList();