我有一个要执行的网络调用列表(它们返回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>
将每个项目与其位置绑定,然后我可以使用该位置进行排序。
任何更简单的方式?
答案 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();