下面给出一个示例org.apache.commons.collections.map.MultiValueMap
(来自commons-collections-3.2.1)
Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>());
multiValueMap.put("orderId", 1L);
for(Map.Entry<String, Object> entry : multiValueMap.entrySet()) {
List<Object> value = (List<Object>) entry.getValue();
System.out.println(entry.getKey()+" : "+value.get(0));
}
看起来不错。它显示一个键和与该键关联的值。
如果声明更改如下,
Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>(){{
put("orderId", 1L);
}});
然后会引发异常-
java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
在foreach
给定的唯一循环的第一行。
在这种情况下,给定的MultiValueMap
实际上不是MultiValueMap
。这是很平常的HashMap
。
以这种方式更改声明有何不同?
MultiValueMap是一个相当简单的地图装饰器。它会覆盖put方法并注入集合,而不是实际值。在获取的情况下,它从基础地图获取集合。
在第二个示例中,您正在装饰一个填充的地图,因此当MultiValueMap尝试获取键的集合时,它会变长:
public Collection getCollection(Object key) {
return (Collection) getMap().get(key);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句