Map.merge的可变版本

时间:2016-03-22 17:11:11

标签: 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&#39; 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;
});

但这并不比原版好。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:4)

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

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