首页 文章

使用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是一个相当简单的 Map 装饰器 . 它会覆盖put方法并注入集合而不是实际值 . 在获取的情况下,它从底层 Map 获取集合 .

    在你的第二个例子中,你正在装饰一个填充的 Map ,所以当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);
    

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

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

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

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

相关问题