You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJava:并行执行Single列表并按原顺序获取结果列表

用RxJava轻松实现并行请求并按原顺序收集结果

嘿,这个场景RxJava其实早就为你准备好完美的解决方案啦!完全不用手动绑定位置这么麻烦,用内置的操作符就能一步搞定~

你现在的需求是:并行执行一批返回Single<Item>的请求,全部成功后得到和原列表顺序一致的List<Item>。RxJava的Single.zip操作符正好就是干这个的!它会自动并行订阅所有输入的Single,并且严格按照你传入的Single列表顺序来组装最终的结果列表,完全不需要自己处理索引、排序这些细节。

举个具体的代码例子:

假设你已经有了一个List<Single<Item>> singleList,只需要这么写:

Single.zip(singleList, objects -> 
    Arrays.stream(objects)
          .map(Item.class::cast)
          .collect(Collectors.toList())
)
.subscribe(
    itemList -> {
        // 这里的itemList就是和原singleList顺序完全一致的结果集合
        // 所有请求都成功才会走到这里
    },
    throwable -> {
        // 只要有一个请求失败,就会触发这个回调
    }
);

为什么这个方法更简洁?

  • 不需要手动用Pair<Item, Integer>绑定位置,也不需要后续排序,Single.zip本身就保证了结果顺序和输入的Single列表顺序一致;
  • 自动并行执行所有请求(前提是每个Single内部都通过subscribeOn(Schedulers.io())指定了非阻塞的调度器,这也是网络请求的常规操作);
  • 语义清晰,看到Single.zip就知道是要组合多个Single的结果,可读性比手动处理索引高很多。

要是你用的是RxJava 3,甚至还能更简洁一点,利用Collectors.toUnmodifiableList()或者直接转成列表,核心逻辑都是一样的。

内容的提问来源于stack exchange,提问作者BoD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:53:35