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

BoD*_*BoD 5 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 -> { ... });
Run Code Online (Sandbox Code Playgroud)

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

有更简单的方法吗?

aka*_*okd 6

用途concatMapEager():

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