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

9
我正在尝试编写一个简单的实用函数,从Map中获取一个值,如果没有找到,则创建一个新的值类并将其放入Map中。
然而,在运行时获得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个回答

20

你应该查看 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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接