我试图编写一个简单的实用程序函数来从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;
}
答案 0 :(得分:7)
你应该剔除Map::getOrDefault
和Map::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);