gpt4 book ai didi

java - 使用Java在 map 中自动创建缺失值的成语

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:23 25 4
gpt4 key购买 nike

我经常使用映射来存储循环中的值,例如属于同一类/组的对象集/列表,或者我想要递增的 AtomicInteger。因此,我经常编写以下类型的代码(假设我没有在我的 map 中存储 null):

/* Example #1 -- aggregation */
Map<K, Set<O>> map = new HashMap<K, Set<O>>();
for (O o : oList) {
K k = o.getK();
Set<O> oSet = map.get(k);
if (oSet == null) {
oSet = new HashSet<O>(o);
map.put(k, oSet);
} else {
oSet.add(o);
}
}

/* Example #2 -- counting */
Map<K, AtomicInteger> map = new HashMap<K, AtomicInteger>();
for (O o : oList) {
K k = o.getK();
AtomicInteger i = map.get(k);
if (i == null) {
i = new AtomicInteger(1);
map.put(k, i);
} else {
i.increment();
}
}

我知道 Apache Common 集合 DefaultedMap,它可以在工厂/模型对象丢失时即时创建一个值;但是您依赖(另一个)外部库只是为了避免编写 2/3 行代码的(相当小的)烦恼。

是否有更简单的解决方案(尤其是对于示例 #2)?在这种情况下,您的开发人员使用/推荐什么?是否有其他图书馆提供这种“默认 map ”?你自己写装饰 map 吗?

最佳答案

在 Java 8 中,方法 computeIfAbsent()被添加到 Map界面:

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.

根据documentation ,最常见的用法是创建一个新对象作为初始映射值或实现多值映射。例如:

map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);

因此您可以按如下方式重写您的示例:

/* Example #1 -- aggregation */
Map<K, Set<O>> map = new HashMap<>();
oList.forEach(o -> map.computeIfAbsent(o.getK(), k -> new HashSet<>()).add(o));

/* Example #2 -- counting */
Map<K, AtomicInteger> map = new HashMap<>();
oList.forEach(o -> map.computeIfAbsent(o.getK(), k -> new AtomicInteger(0)).incrementAndGet());

另一种选择是将 Stream API 与 Collectors.groupingBy 一起使用:

/* Example #1 -- aggregation */
Map<K, Set<O>> map = oList.stream()
.collect(Collectors.groupingBy(O::getK, Collectors.toSet()));

/* Example #2 -- counting using a Long instead of an AtomicInteger */
Map<K, Long> map = oList.stream()
.map(O::getK)
.collect(Collectors.groupingBy(k -> k, Collectors.counting()));

关于java - 使用Java在 map 中自动创建缺失值的成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com