我正在尝试编写一个简单的实用程序函数来从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)
你应该ckeck出来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
Run Code Online (Sandbox Code Playgroud)
假设您总是希望使用key作为参数创建Value类的新实例,并假设该类实际上具有这样的构造函数),您可以使用以下代码:
YourClass obj = map.computeIfAbsent(key, YourClass::new);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1559 次 |
| 最近记录: |