2014-10-06 34 views
4

下面给出的org.apache.commons.collections.map.MultiValueMap一个例子的MultiValueMap(commons-collections提供-3.2.1)使用Apache的共享集合

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

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); 

在将以上版本( ...)在变量multiValueMap上被调用。

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

在这个版本的认沽(...)的类的实例初始化前的一倍{{,即:在HashMap的内部要求收回。

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