使用Apache Commons Collections中的MultiValueMap

4
以下是一个例子,使用了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个回答

3

MultiValueMap是一个相当简单的映射修饰器。它重写了put方法,并注入集合而不是实际值。在获得集合时,它从基础映射中获取集合。

在您的第二个示例中,您正在装饰已填充的映射,因此当MultiValueMap尝试获取您的键的集合时,它会获取一个长整型:

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

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

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

在上面的版本中,put(...)是在变量multiValueMap上调用的。
Map<String, Object> multiValueMap = MultiValueMap.decorate(new HashMap<String, Object>(){{
    put("orderId", 1L);
}});

在这个版本中,put(...)是在类的实例初始化器中调用的,在双重{{之前,即在HashMap上。
因此,这两段代码不等价。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接