gpt4 book ai didi

java - 合并 Map Java 8 Stream

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:45 24 4
gpt4 key购买 nike

我想将两个 Map 与 JAVA 8 Stream 合并:

Map<String, List<String>> mapGlobal = new HashMap<String, List<String>>();
Map<String, List<String>> mapAdded = new HashMap<String, List<String>>();

我尝试使用这个实现:

mapGlobal = Stream.of(mapGlobal, mapAdded)
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())
));

但是,此实现只会产生如下结果:

Map<String, List<Object>>

如果 mapGlobal 中没有一个键,它将作为一个新的键与相应的字符串列表一起添加。如果 key 在 mapGlobal 中重复和 mapAdded ,两个值列表将合并为:A = {1, 3, 5, 7}B = {1, 2, 4, 6}然后A ∪ B = {1, 2, 3, 4, 5, 6, 7} .

最佳答案

您可以通过遍历 mapAdded 中的所有条目并将它们合并到 mapGlobal 中来完成此操作。

以下通过调用 forEach(action) 遍历 mapAdded 的条目其中操作使用每个条目的键和值。对于每个条目,我们调用 merge(key, value, remappingFunction)mapGlobal 上:如果键不存在,这将在键 k 和值 v 下创建条目,否则它将调用给定的重新映射函数(如果它们已经存在)。此函数采用 2 个列表进行合并,在本例中,首先将其添加到 TreeSet 以确保唯一且已排序的元素并转换回列表:

mapAdded.forEach((k, v) -> mapGlobal.merge(k, v, (v1, v2) -> {
Set<String> set = new TreeSet<>(v1);
set.addAll(v2);
return new ArrayList<>(set);
}));

如果您想要潜在地并行运行,您可以通过获取 entrySet() 并在其上调用 parallelStream() 来创建 Stream 管道。但是,您需要确保为 mapGlobal 使用支持并发的 map ,例如 ConcurrentHashMap

ConcurrentMap<String, List<String>> mapGlobal = new ConcurrentHashMap<>();
// ...
mapAdded.entrySet().parallelStream().forEach(e -> mapGlobal.merge(e.getKey(), e.getValue(), (v1, v2) -> {
Set<String> set = new TreeSet<>(v1);
set.addAll(v2);
return new ArrayList<>(set);
}));

关于java - 合并 Map<String, List<String> Java 8 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36211405/

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