【问题标题】:How to add an element to HashMap<K, List<V>> using merge function如何使用合并函数将元素添加到 HashMap<K, List<V>>
【发布时间】:2021-07-09 08:42:09
【问题描述】:

在维护 HashMap 时,merge 是一个非常有用的命令。我喜欢使用以下表达式将数字添加到总和的简洁方法 map.merge(key, value, Double::sum);

我有一个要更新的 HashMap。我可以使用类似的东西

if (!map.containsKey(key)) map.put(key, new List());
map.get(key).add(value);

有没有更优雅的方式使用合并来实现这一点?

【问题讨论】:

  • 您应该在文档中查找map.compute 兄弟函数。
  • 您最初的问题是什么?您不需要以某种方式对传入数据进行分组吗?这可以通过 stream/groupBy 而不是循环来实现

标签: java merge hashmap


【解决方案1】:

merge 方法在这里可以类似地使用:

map.merge(key,
     List.of(value),
     (l1, l2) -> Stream.concat(l1.stream(), Stream.of(value)).collect(Collectors.toList()));

注意:我在这里使用Stream,因为列表可以是不可变的(初始值List.of(value)就是这种情况)

但是,除非您使用的是 ConcurrentHashMap,否则我怀疑这是否会像简单的 if 解决方案一样优雅。

【讨论】:

    【解决方案2】:

    如果您拥有预先构建地图所需的所有数据,那么您可以这样做

    final Map<String, List<X>> result = list.stream().collect(Collectors.groupingBy(x -> x.key, Collectors.toList()));
    

    否则,您可以使用computeIfAbsent,但它与您已经拥有的基本相同

    result.computeIfAbsent(x.key, (key) -> new ArrayList<>()).add(x);
    

    【讨论】:

    • putIfAbsent(x.key, new ArrayList&lt;&gt;()) 在每次调用时都会创建一个空列表,这很浪费。您应该改用computeIfAbsent()
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2014-05-25
    • 2017-09-15
    相关资源
    最近更新 更多