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

Ian*_*Ian 4 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;
}
Run Code Online (Sandbox Code Playgroud)

tob*_*s_k 7

你应该ckeck出来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
Run Code Online (Sandbox Code Playgroud)

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

YourClass obj = map.computeIfAbsent(key, YourClass::new);
Run Code Online (Sandbox Code Playgroud)