【问题标题】:Using a MultiValueMap from Apache Commons Collections使用 Apache Commons Collections 中的 MultiValueMap
【发布时间】:2014-10-06 11:25:54
【问题描述】:

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

以这种方式更改声明有何不同?

【问题讨论】:

    标签: java apache-commons-collection


    【解决方案1】:

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

    在您的第二个示例中,您正在装饰一个填充的地图,因此当 MultiValueMap 尝试获取您的键的集合时,它会变得很长:

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

    【讨论】:

      【解决方案2】:
      Map<String, Object> multiValueMap1 = new HashMap<String, Object>() {
              {
                  put("orderId",
                          new ArrayList<Object>(Arrays
                                  .asList(new Object[] { 1L })));
              }
          };
      

      【讨论】:

        【解决方案3】:
        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 上。

        因此,两段代码并不等价。

        【讨论】:

          猜你喜欢
          • 2014-05-02
          • 2015-11-19
          • 2020-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多