私はよくマップを使用して、同じクラス/グループに関連するオブジェクトのセット/リストや、インクリメントしたい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();
}
}
DefaultedMap
ファクトリ/モデルオブジェクトが欠落しているときにその場で値を作成できるApacheCommonコレクションを知っています。しかし、2/3行のコードを書くという(かなり小さな)煩わしさを避けるために、(別の)外部ライブラリに依存しています。
より簡単な解決策はありますか(特にたとえば#2)?その場合、他の開発者は何を使用/推奨しますか?この種の「デフォルトマップ」を提供している他のライブラリはありますか?あなたはあなた自身の装飾された地図を書きますか?