使用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()。根据您想要的值在newHashMap
中组合/分组您的任务
?每个任务的结果.get()应该使用map.putAll()组合到newHashMap
中