使用RxJava将并行任务列表的结果合并到单个HashMap

使用RxJava将并行任务列表的结果合并到单个HashMap,java,rx-java,reactive-programming,rx-android,Java,Rx Java,Reactive Programming,Rx Android,我有一个列表,其中任务是一个带有单个方法的接口,该方法返回一个映射。如何并行执行列表,并返回一个新的哈希映射,以及每个任务的组合结果 我目前有: List<Task> tasks = getTasks(); Observable.from(tasks) .flatMap(new Func1<Task, Observable<Map<String, JsonElement>>>() { @Override p

我有一个
列表
,其中
任务
是一个带有单个方法的接口,该方法返回一个
映射
。如何并行执行
列表
,并返回一个新的
哈希映射
,以及每个
任务
的组合结果

我目前有:

List<Task> tasks = getTasks();

Observable.from(tasks)
    .flatMap(new Func1<Task, Observable<Map<String, JsonElement>>>() {
        @Override
        public Observable<Map<String, JsonElement>> call(Task task) {
            return Observable.just(task.get());
        }
    });

// group into single Map<String,JsonElement>
// create Observable<Map<String,JsonElement>> with all results
List tasks=getTasks();
可观察的。来自(任务)
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(任务){
返回Observable.just(task.get());
}
});
//分组成一张地图
//创建可观察的所有结果

使用
延迟
封装每个订阅的
映射
,并根据您想要的线程池大小封装一个
调度程序

Scheduler scheduler = Schedulers.from(Executors.newFixedThreadPool(5));
Observable.defer(() -> {
  final Map<String, JsonElement> map = new ConcurrentHashMap<>();
  return Observable
    .from(tasks)
    .flatMap(task -> 
      Observable
        .fromCallable(task -> task.get())
        .doOnNext(mp -> map.putAll(mp)) 
        .subscribeOn(scheduler))
    .ignoreElements()
    .concatWith(Observable.just(map));
});
Scheduler=Schedulers.from(Executors.newFixedThreadPool(5));
可观察。延迟(()->{
最终映射=新的ConcurrentHashMap();
可观测回波
.来自(任务)
.flatMap(任务->
可观察
.fromCallable(任务->任务.get())
.doOnNext(mp->map.putAll(mp))
.subscribeOn(调度程序))
.ignoreElements()
.concatWith(可观察到的。只是(地图));
});

请注意,
Scheduler
的选择将取决于所执行任务的性质。如果是CPU占主导地位的话,您可能会喜欢使用调度程序.computation()。

根据您想要的值在new
HashMap
中组合/分组您的
任务
?每个任务的结果.get()应该使用
map.putAll()组合到new
HashMap