如何使用合并功能向HashMap添加元素<K, List<V>>

问题描述 投票:0回答:3
维护HashMap时,merge是一个非常有用的命令。我喜欢使用以下表达式将数字添加到总和中的简洁方法

map.merge(key, value, Double::sum);


我有一个 HashMap

我想更新。我可以使用类似的东西

if (!map.containsKey(key)) map.put(key, new List()); map.get(key).add(value);
有没有更优雅的方式使用合并来实现这一点?

java merge hashmap
3个回答
3
投票
这里可以类似地使用

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
 解决方案一样优雅。


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

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);
    

0
投票
我们可以利用这样一个事实,即 BiFunction 这里采用 oldValue List(针对键的当前值)和 newValue List(您想要添加/删除/为键创建新结果值的任何值)作为参数,对它们进行操作以返回第三个列表,这将是映射中该键的新状态。

map.merge(key, Arrays.asList(new String[]{newStringToBeAdded}), (oldList, newList) -> { return new ArrayList<String>(){{ addAll(oldList); addAll(newList); }}; });
为了方便起见,我们在这里使用

双括号初始化

© www.soinside.com 2019 - 2024. All rights reserved.