我经常使用映射将值存储在循环中,例如属于同一类/组的对象集/列表,或者我想要递增的 AtomicInteger。因此,我经常编写以下类型的代码(假设我没有在我的地图中存储 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)?在这种情况下,您的开发人员同事使用/推荐什么?是否有其他库提供这种“默认地图”?你自己写装饰地图吗?