gpt4 book ai didi

java - map 上复杂操作的问题

转载 作者:行者123 更新时间:2023-12-01 22:25:42 25 4
gpt4 key购买 nike

假设我有以下两张 map :

Map<Member, List<Message>> one = ...;//one constructed somehow
Map<Member, List<Message>> two = ...;//two also constructed somehow

我想获得第三张 map ,其中包含一个两个的内容。

因此,如果成员键同时存在于一和二中,则二中条目的列表值将添加到一中条目的列表值中。

使用 java 8 实现这一目标的最佳和最干净的方法是什么?

最佳答案

您可以使用合并方法。

Map<Member, List<Message>> third = new HashMap<>(one);
two.forEach((k, v) -> third.merge(k, v, (v1, v2) -> {v1.addAll(v2); return v1;}));

这也会修改 map 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();

关于java - map 上复杂操作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com