我有一个网络调用列表(他们返回一个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>
来绑定每个项目的位置,然后我可以使用该位置进行排序.
有更简单的方法吗?
用途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)
归档时间: |
|
查看次数: |
983 次 |
最近记录: |