如何合并从执行者 Future 返回的多图列表与 Java8
How to merge List of Multimaps returned from executors Future with Java8
假设我有以下代码片段:(未来是 Callable 任务的结果)
List<Map<String, List<Offset>>> results = new ArrayList<>();
for (Future<Map<String, List<Offset>>> future : listFutures) {
Map<String, List<Offset>> mapResult = future.get();
results.add(mapResult);
}
我想将所有 Futures
中的所有 "Map<String, List<Offset>>"
聚合到 flatMap
中,用例是映射之间的重复键,在这种情况下我需要将值添加到 List<Offset>
的列表中
我预计在 flatMap 之后,结果为 "Map<String, List<Offset>>"
P.S
我看到了一些例子,但他们不是在迭代过程中说话。
Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(
entry -> entry.getKey(),
entry -> entry.getValue()
)
);
有什么建议吗?
如果我做对了...
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;
});
}
}
假设我有以下代码片段:(未来是 Callable 任务的结果)
List<Map<String, List<Offset>>> results = new ArrayList<>();
for (Future<Map<String, List<Offset>>> future : listFutures) {
Map<String, List<Offset>> mapResult = future.get();
results.add(mapResult);
}
我想将所有 Futures
中的所有 "Map<String, List<Offset>>"
聚合到 flatMap
中,用例是映射之间的重复键,在这种情况下我需要将值添加到 List<Offset>
我预计在 flatMap 之后,结果为 "Map<String, List<Offset>>"
P.S
我看到了一些例子,但他们不是在迭代过程中说话。
Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(
entry -> entry.getKey(),
entry -> entry.getValue()
)
);
有什么建议吗?
如果我做对了...
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;
});
}
}