如何获取或创建新的地图条目

时间:2016-08-20 14:55:45

标签: java

我试图编写一个简单的实用程序函数来从Map中获取值,如果找不到它来创建新的值类并将其放在地图中。

似乎很难在运行时获取地图的关键和值的类别,而我能想到的最好的东西是以下几行中可怕的东西。

有更好的方法吗?

private Object getOrCreate( Map<Object, Object> map, Object key, Class<?> mapValueClass ) {
    Object value = map.get( key );      

    if (value == null) {                     
        Constructor<?> con = mapValueClass.getConstructor( key.getClass() );
        value = con.newInstance( key );  
        map.put( key, value );               
    }

    return value;
}

1 个答案:

答案 0 :(得分:7)

你应该剔除Map::getOrDefaultMap::computeIfAbsent(在Java 8中添加);那些几乎完全符合你的功能。两者之间的区别在于getOrDefault将接受现有实例(在调用方法之前创建)并在需要时返回它,但不会将其添加到地图中,而computeIfAbsend接受函数懒惰地创建一个新值,并将该值添加到地图中。

Map<String, List<Integer>> map = new HashMap<>();

List<Integer> list1 = map.getOrDefault("foo", Collections.emptyList());
System.out.println(list1); // empty list
System.out.println(map);   // map is still empty

List<Integer> list2 = map.computeIfAbsent("bar", s -> new ArrayList<Integer>());
System.out.println(list2); // empty list
System.out.println(map);   // entry added to map

假设您总是希望使用key作为参数创建Value类的新实例,并假设该类实际上具有这样的构造函数),您可以例如用这个:

YourClass obj = map.computeIfAbsent(key, YourClass::new);