2014-10-06 78 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的內部要求收回。

因此,這兩段代碼並不等同。