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
相关产品推荐
相关产品推荐

