java - 使用来自 Apache Commons Collections 的 MultiValueMap

标签 java apache-commons-collection

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

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

最佳答案

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

在您的第二个示例中,您正在装饰一个已填充的 map ,因此当 MultiValueMap 尝试获取您的键的集合时,它会变成一个 long:

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

关于java - 使用来自 Apache Commons Collections 的 MultiValueMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26215223/

相关文章:

java - 如何重命名一个文件而不创建另一个文件(Java)

java - mvc :annotation-driven in dispatcher servlet configuration 内的冲突

java - Gradle - 不要在多模块项目中创建父构建

java - 一个 Map<String, List<String>> 实现,暴露一个 "last values"的 View Map

java - 将泛型与 Jakarta 公共(public)集合缓冲区一起使用

java - 在 J2EE 服务变得可用之前延迟访问静态网页的最佳方法

java - Varagrs、数组和参数列表

java.lang.NoClassDefFoundError : com. sun.org.apache.commons.beanutils.PropertyUtils

java - 升级到 commons-collections4 抛出 NoClassDefFoundError