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

时间:2017-06-08 17:05:16

标签: java rx-java rx-java2

我有Map这样的任务:

Map<Identifier, Observable<Progress>> tasks;

我想将其转换为:

Observable<Map<Identifier, Progress>>

每个Map<Identifier, Progress> element包含每个任务的最新元素。

我希望新的Observable仅在所有任务完成时完成,并在任何其中一个任务失败时失败。

这是否有一个组合器?

1 个答案:

答案 0 :(得分:1)

要将单Map<Identifier, Observable<Progress>> task转换为<Identifier, Progress>,请使用:

Observable.just(Identifier)
    .flatMap(Observable<Progress> progressObservable, 
        (Identifier, Progress, Pair<Identifier, Progress>) -> {create pair of elements})

要将这些任务组合在一起,请使用combineLatest运算符

Observable.combineLatest(List<Observable<Pair<Identifier, Progress>>>, 
    (List<Pair<Identifier, Progress>>) -> {merge into `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)));
}