メソッドに追加のパラメータ(Supplier
,Collection
インスタンス)を渡す必要があります。
ここに1つの可能な実装があります:
public static <TKey, TVal> void addToMapOfCollections(Map<TKey, Collection<TVal>> map, TKey key, TVal val, Supplier<Collection<TVal>> supplier)
{
Collection<TVal> col = map.get(key);
if (col == null) {
col = supplier.get();
col.add(val);
map.put(key, col);
} else {
col.add(val);
}
}
少ないコード(ジェラルドにより示唆されるように)と::
public static <TKey, TVal> void addToMapOfCollections(Map<TKey, Collection<TVal>> map, TKey key, TVal val, Supplier<Collection<TVal>> supplier)
{
map.putIfAbsent(key, supplier.get());
map.get(key).add(val);
}
私は第二の変形例をテストし
public static <TKey, TVal, TCol extends Collection<TVal>> void addToMapOfCollections(Map<TKey, Collection<TVal>> map, TKey key, TVal val, Supplier<TCol> supplier)
{
Collection<TVal> col = map.get(key);
if (col == null) {
col = supplier.get();
col.add(val);
map.put(key, col);
} else {
col.add(val);
}
}
ここでは別のオプションがあります:
Map<String,Collection<Integer>> map = new HashMap<String, Collection<Integer>>();
addToMapOfCollections(map,"String1",5,HashSet::new);
addToMapOfCollections(map,"String2",67,ArrayList::new);
addToMapOfCollections(map,"String2",68,ArrayList::new);
System.out.println (map);
for (Collection<Integer> col : map.values()) {
System.out.println (col.getClass() + " : " + col);
}
出力:あなたがリストまたはセットを使用することを選択した方法
{String2=[67, 68], String1=[5]}
class java.util.ArrayList : [67, 68]
class java.util.HashSet : [5]
? Javaでのリフレクションによって、実行時にパラメータMapのジェネリック型が見つからないことがあります。 –
可能な複製http://stackoverflow.com/questions/254351/map-of-collections –
明らかに(C++由来) - リストまたはセットはマップのタイプに応じて選択されます。いずれかのデフォルトctorが呼び出されます。 – ytoledano