合并Map Java 8 Stream
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了合并Map Java 8 Stream,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1634字,纯文字阅读大概需要3分钟。
内容图文
![合并Map Java 8 Stream](/upload/InfoBanner/zyjiaocheng/701/4cdd41885da84185aeab9128af8cd9f3.jpg)
我想将两个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中没有包含一个键,则它将作为具有相应List of String的新键添加.如果密钥在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的条目,其中操作使用每个条目的键和值.对于每个条目,我们在mapGlobal上调用merge(key, value, remappingFunction):这将在键k下创建条目,如果键不存在则为值v,或者如果它们已经存在则将调用给定的重映射函数.此函数将合并两个列表,在这种情况下,首先将它们添加到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);
}));
内容总结
以上是互联网集市为您收集整理的合并Map Java 8 Stream全部内容,希望文章能够帮你解决合并Map Java 8 Stream所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。