用于组合地图的RxJava组合器?

用于组合地图的RxJava组合器?,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我有一张这样的任务的地图: Map<Identifier, Observable<Progress>> tasks; Map任务; 我想将此转换为: Observable<Map<Identifier, Progress>> 可观察 其中,每个映射元素包含每个任务的最新元素 我希望新的可观察的仅在所有任务完成时完成,并且在任何一个任务失败时失败 是否有用于此的组合器?要将单个映射任务转换为,请使用: Observable.just(Iden

我有一张这样的任务的
地图

Map<Identifier, Observable<Progress>> tasks;
Map任务;
我想将此转换为:

Observable<Map<Identifier, Progress>>
可观察
其中,每个
映射元素
包含每个任务的最新元素

我希望新的
可观察的
仅在所有任务完成时完成,并且在任何一个任务失败时失败


是否有用于此的组合器?

要将单个
映射任务
转换为
,请使用:

Observable.just(Identifier)
    .flatMap(Observable<Progress> progressObservable, 
        (Identifier, Progress, Pair<Identifier, Progress>) -> {create pair of elements})
Observable.just(标识符)
.平面图(可观察到的、可观察到的、,
(标识符、进度、对)->{创建元素对})
要将这些任务组合在一起,请使用operator

可观察的组合测试(列表,
(列表)->{合并到'Map`}
我希望我能很好地理解你的想法。当然,是用伪代码编写的


实施:

public static <T, S> Observable<Map<T, S>> zipMaps(final Map<T, Observable<S>> tasks) {
    Objects.requireNonNull(tasks, "tasks is null");
    return Observable.combineLatest(
        tasks.entrySet()
            .stream()
            .map(entry -> Observable.combineLatest(
                Observable.just(entry.getKey()),
                entry.getValue(),
                Pair::with))
            .collect(ImmutableList.toImmutableList()),
        xs -> Arrays.stream(xs)
            .map(x -> (Pair<T, S>)x)
            .collect(ImmutableMap.toImmutableMap(Pair::getValue0, Pair::getValue1)));
}
公共静态可观察zipMaps(最终地图任务){
Objects.requirennull(任务,“任务为空”);
返回可观测的(
tasks.entrySet()
.stream()
.map(条目->可观察的.CombineTest(
Observable.just(entry.getKey()),
entry.getValue(),
配对(与)
.collect(ImmutableList.toImmutableList()),
xs->array.stream(xs)
.map(x->(对)x)
.collect(ImmutableMap.toImmutableMap(Pair::getValue0,Pair::getValue1));
}

似乎有效。我根据您的提示添加了我的实现。
public static <T, S> Observable<Map<T, S>> zipMaps(final Map<T, Observable<S>> tasks) {
    Objects.requireNonNull(tasks, "tasks is null");
    return Observable.combineLatest(
        tasks.entrySet()
            .stream()
            .map(entry -> Observable.combineLatest(
                Observable.just(entry.getKey()),
                entry.getValue(),
                Pair::with))
            .collect(ImmutableList.toImmutableList()),
        xs -> Arrays.stream(xs)
            .map(x -> (Pair<T, S>)x)
            .collect(ImmutableMap.toImmutableMap(Pair::getValue0, Pair::getValue1)));
}