使用Apache Commons Collections中的MultiValueMap

时间:2014-10-06 11:25:54

标签: java apache-commons-collection

下面给出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

以这种方式更改声明如何有所作为?

3 个答案:

答案 0 :(得分:3)

MultiValueMap是一个相当简单的地图装饰器。它会覆盖put方法并注入集合而不是实际值。在获取的情况下,它从底层地图获取集合。

在你的第二个例子中,你正在装饰一个填充的地图,所以当MultiValueMap试图获取你的密钥的集合时,它会变长:

 public Collection  getCollection(Object key) {
    return (Collection) getMap().get(key);
}

答案 1 :(得分:1)

Map<String, Object> multiValueMap1 = new HashMap<String, Object>() {
        {
            put("orderId",
                    new ArrayList<Object>(Arrays
                            .asList(new Object[] { 1L })));
        }
    };

答案 2 :(得分:1)

Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>());
multiValueMap.put("orderId", 1L);

在上面的版本中,在变量multiValueMap上调用put(...)。

Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>(){{
    put("orderId", 1L);
}});

在这个版本中,在double {{,即在HashMap上)之前,在类的实例初始值设定项中调用put(...)。

因此,这两段代码并不相同。