java - Map.merge 的可变版本

标签 java dictionary java-8

<分区>

Java 8 为 Map 引入了一些不错的方法界面。对我来说,一个差距是没有可变版本的 merge方法。

例如,假设mapMap<String, List<Integer>>并且您想这样做:

List<Integer> list = map.get("a");
if (list == null)
    list = map.put("a", new ArrayList<>());
list.add(1);

(我知道你可以使用 Guava 的 MultiMap 来做这种事情,但我对标准 Java 很感兴趣。)

对我来说,感觉应该有一种在 Java 8 中简化它的好方法,但我找不到它。我认为它应该是一个单一的方法调用,比如

map.mutableMerge("a", 1, ArrayList::new, List::add);     // Not real code

但我能想到的最好的方法是使用新方法

map.computeIfAbsent("a", k -> new ArrayList<>());
map.compute("a", (k, v) -> {
    v.add(1);
    return v;
});

但这并不比原来的好。我是否遗漏了一些明显的东西?

最佳答案

computeIfAbsent返回与键关联的值,该值可以是当前值,也可以是映射函数构造的值。所以你可以简单地拥有

map.computeIfAbsent("a", k -> new ArrayList<>()).add(1);

关于java - Map.merge 的可变版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36160927/

相关文章:

java - 在Java 7和8中创建与现有列表不同的列表?

java - 具有节点子类的树子类?

java - 如何从 Java 中的方法返回通用 Map

java - Java8 中不合逻辑的类型推断

java - 在Java中获取行单元格中的总计

java - 如何反转 @ManyToMany JPA 关系一侧的键值映射类型

python - .get 和字典

具有多个语句的 Java 8 Lambda Stream forEach

java.text.Collat​​or 将 "v"和 "w"视为瑞典语/区域设置的相同字母

java - 将节点放入节点中