你可以使用合并方法。
Map<Member, List<Message>> third = new HashMap<>(one);
two.forEach((k, v) -> third.merge(k, v, (v1, v2) -> {v1.addAll(v2); return v1;}));
这也将修改地图one 中的列表,因为您正在操作相同的引用。如果你不想要,即创建一个新列表,你可以这样做:
Map<Member, List<Message>> third = new HashMap<>(one);
two.forEach((k, v) -> third.merge(k, v, (v1, v2) -> Stream.concat(v1.stream(), v2.stream()).collect(toList())));
合并后的列表将是一个新列表,但请注意,两个地图中都没有的键不会出现这种情况。您需要深度复制所有列表才能实现此目的。
刚刚使用 Stream API 添加了另一个解决方案:
Map<Member, List<Message>> third = Stream.of(one, two)
.flatMap(m -> m.entrySet().stream())
.collect(toMap(Map.Entry::getKey,
Map.Entry::getValue,
(l1, l2) -> Stream.concat(l1.stream(), l2.stream()).collect(toList())));
我还将我的贡献添加到proton-pack library。有了这个,你也可以像这样实现它:
Map<Member, List<Message>> third = MapStream.ofMaps(one, two)
.mergeKeys((l1, l2) -> Stream.concat(l1.stream(), l2.stream()).collect(toList()))
.collect();