我想将两个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
,则会将其作为新键添加到相应的String列表中。如果键在mapGlobal
和中重复mapAdded
,则两个值列表将被合并为:A = {1, 3, 5, 7}
,B = {1, 2, 4, 6}
然后是A ∪ B = {1, 2, 3, 4, 5, 6, 7}
。
您可以通过遍历中的所有条目mapAdded
并将它们合并到中来实现此目的mapGlobal
。
下面mapAdded
通过调用forEach(action)
操作消耗每个条目的键和值的位置来遍历的条目。对于每个条目,我们叫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
,例如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);
}));
我试图使用
问题内容: 我有两个键为s且值为的映射。给定两个s,合并它们的最简单方法是什么,如果两个键相同,则值是两个集合的并集。您可以假设值永远不会为null,并且如果有用的话,我们可以将它们设为s。 问题答案: 我们在谈论实例。在这种情况下,查找值为O(1),因此您只需获取一个映射,然后对该映射的条目进行迭代,看看另一个映射是否包含该键。如果没有,只需添加设置。如果包含密钥,则将两个集合并集(通过将一个集
我想按id分组。 结果应如下所示: 静态编程语言中最惯用的方法是什么?
操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]
我试图对对象中的每个条目执行映射操作。 我需要从键中去掉前缀,并将值从一种类型转换为另一种类型。我的代码从 映射实例并使用,这看起来很难看。 还有更好的选择吗?使用for循环似乎更好: 我应该避免使用流API吗?还是我错过了更好的方式?
我有两个(或更多)