Java:添加到集合的映射

Java:添加到集合的映射,java,generics,dictionary,collections,Java,Generics,Dictionary,Collections,我正在尝试编写一个通用函数,它将向集合的映射添加一个元素。这适用于列表的映射: public static <TKey, TVal> void addToMapOfLists(Map<TKey, List<TVal>> map, TKey key, TVal val) { List<TVal> list = map.get(key); if (list == null) { list = new ArrayList&

我正在尝试编写一个通用函数,它将向
集合的
映射添加一个元素。这适用于
列表的
映射

public static <TKey, TVal> void addToMapOfLists(Map<TKey, List<TVal>> map, TKey key, TVal val) {
    List<TVal> list = map.get(key);
    if (list == null) {
        list = new ArrayList<>();
        list.add(val);
        map.put(key, list);
    } else
        list.add(val);
}
publicstaticvoidaddtomapflists(地图地图、TKey、TVal){
List=map.get(键);
if(list==null){
列表=新的ArrayList();
列表。添加(val);
地图。放置(键、列表);
}否则
列表。添加(val);
}
我想使此函数在
Map
以及
Map
上工作。我认为这应该是可能的,因为两者都实现了具有我调用的
add(TVal)
成员的
Collection


我的问题是,当我尝试将参数
Map-Map
更改为
Map-Map
时,我需要以某种方式替换
new ArrayList()通过调用
集合

的实现者的构造函数,您必须向方法传递一个额外的参数-集合
实例的
供应商

下面是一个可能的实现:

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

您如何选择使用列表或集合?通过java中的反射,您无法在运行时找到参数映射的一般类型。根据映射的类型,可能会选择重复的(来自C++)-列表或集合。默认的ctor是为任何一个调用的。@AnkitTripathi,在问这个问题之前,我看了那个问题。该问题询问如何定义新类型,这询问如何添加到现有映射。对于这个问题,答案也不是很有用。通过使用
putIfAbsent
初始化集合,可以对该方法进行进一步简化:
map.putIfAbsent(key,supplier.get());map.get(key).add(value)
@GeraldMücke这是一个很好的建议。
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);
}
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]