Java 8 地图合并方法

Posted

技术标签:

【中文标题】Java 8 地图合并方法【英文标题】:Java 8 map merge method 【发布时间】:2014-08-09 22:47:27 【问题描述】:

我正在尝试创建一个包含一个整数作为键和一个字符串列表作为值的 HashMap:

Map<Integer, List<String>> map = new HashMap<Integer, List<String>>(30);

我想以某种方式有效地填充它。我想出的是:

map.merge(search_key, new ArrayList<>(Arrays.asList(new_string)), (v1, v2) -> 
                    v1.addAll(v2);
                    return v1;
                );

这段代码小而优雅,但我的问题是我在每次调用时都会创建一个新的List。有什么方法可以在第一次合并后跳过创建列表,只需在第一个创建的列表中添加 new_string ?

【问题讨论】:

“这段代码小而优雅”但是坏了。尝试在 Arrays.asList 的结果上调用 addAll 是行不通的…… @Holger 你是对的。我的错误是 Arrays.asList(new_string) 给出了一个固定列表,我会修复它。 【参考方案1】:

你应该使用Map::computeIfAbsent的方法来懒惰地创建一个列表:

map.computeIfAbsent(search_key, k -> new ArrayList<>())
   .add(new_string);

【讨论】:

以上是关于Java 8 地图合并方法的主要内容,如果未能解决你的问题,请参考以下文章

Scala:将地图列表与每个键的最大值合并的惯用方法?

合并 ES6 地图/集的最简单方法?

合并两个地图并对相同键的值求和的最佳方法?

通过流java 8在地图中折叠两个列表

合并两个地图

如何使用流将列表转换为带有索引的地图 - Java 8?