如何将未来执行器返回的多重映射列表与Java8合并

如何将未来执行器返回的多重映射列表与Java8合并,java,java-8,executorservice,Java,Java 8,Executorservice,假设我有以下代码片段:(未来是可调用任务的结果) 有什么建议吗?如果我一切都对的话 listFutures.stream() .map(x -> { try { return x.get(); } catch (InterruptedException | ExecutionException e) { throw new

假设我有以下代码片段:(未来是可调用任务的结果)


有什么建议吗?

如果我一切都对的话

listFutures.stream()
            .map(x -> {
                try {
                    return x.get();
                } catch (InterruptedException | ExecutionException e) {
                    throw new RuntimeException(e);
                }
            })
            .flatMap(x -> x.entrySet().stream())
            .collect(Collectors.toMap(
                    Entry::getKey,
                    Entry::getValue,
                    (left, right) -> {
                        left.addAll(right);
                        return left;
                    }));
可能是一种更简单的方式:

    for (Future<Map<String, List<Offset>>> f : listFutures) {
        Map<String, List<Offset>> inner = f.get();
        for (Entry<String, List<Offset>> e : inner.entrySet()) {
            results.merge(e.getKey(), e.getValue(), (left, right) -> {
                left.addAll(right);
                return left;
            });
        }
    }
未来(f:listFutures)的
{
Map inner=f.get();
对于(条目e:internal.entrySet()){
结果.合并(e.getKey(),e.getValue(),(左,右)->{
左。addAll(右);
左转;
});
}
}

所以你的输出应该是
Map
?如果你必须处理重复项,你必须手动将这些值添加到结果图的值列表中,但这应该相当简单,或者你到底尝试了什么?@Eugene,是的,确切地说---->Map你想如何处理那些通过
将来失败的值。获取
?@Eugene,这是另一个问题,谢谢,但是让我们在开始的时候假设一条快乐的道路,一切都会从未来开始……内部变量是不必要的;您可以像
那样简单地循环(条目e:e.get())
。或者,使用
f.get().forEach((键,值)->…
,作为
map.forEach
确实是对
.entrySet()
…最大化的语法改进:
listFutures.forEach(f->f.get().forEach((k,v)->results.merge(k,v,(l,r)->{l.addAll(r);return l;})
wow…似乎是对的我得到了结果,你能解释一下“合并”的最后一部分吗?…特别是“results.merge(e.getKey(),e.getValue(),(左,右)->{left.addAll(右);return left;}”@您可以阅读
Map#merge
文档,基本上是将数据放入
HashMap
merge
现有数据的一种方式
listFutures.stream()
            .map(x -> {
                try {
                    return x.get();
                } catch (InterruptedException | ExecutionException e) {
                    throw new RuntimeException(e);
                }
            })
            .flatMap(x -> x.entrySet().stream())
            .collect(Collectors.toMap(
                    Entry::getKey,
                    Entry::getValue,
                    (left, right) -> {
                        left.addAll(right);
                        return left;
                    }));
    for (Future<Map<String, List<Offset>>> f : listFutures) {
        Map<String, List<Offset>> inner = f.get();
        for (Entry<String, List<Offset>> e : inner.entrySet()) {
            results.merge(e.getKey(), e.getValue(), (left, right) -> {
                left.addAll(right);
                return left;
            });
        }
    }