有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否存在具有不同值类型的多重映射

我的应用程序需要一个多值映射,其键有两种类型的值,比如List和String。Map可以返回所有值,也可以根据get(key,type)中的type参数返回单个值

在spring或apache多值映射中都找不到这样的功能。 是否有其他库提供这种数据结构,或者我必须实现自己的数据结构


共 (3) 个答案

  1. # 1 楼答案

    在Java8中添加具有不同值的lamda表达式的multimap有点容易。下面是示例代码。你可以试试

    public class TestMultiMap<K, V> {
    
        private final Map<K, Set<V>> multiValueMap = new HashMap<>();
    
        public void put(K key, V value) {
            this.multiValueMap.computeIfAbsent(key, k -> new HashSet<>()).add(value);
        }   
        public Set<V> get(K key) {
            return this.multiValueMap.getOrDefault(key, Collections.emptySet());
        }
    }
    

    computeIfAbsent()方法接受一个键和一个lambda。如果该键不存在,则运行computeFabSent()并创建新的HashMap

    getOrDefault()方法返回值,如果发现键为null,则返回空集

    用这个

    TestMultiMap<String,Object> testMultiMap = new TestMultiMap<>();
    testMultiMap.put("Key 1", new Object());
    testMultiMap.put("Key 2", "String 1");
    testMultiMap.put("Key 3", 1);
    
  2. # 2 楼答案

    创建自己的对象

    public class YourOwnObject {
    
        private HashMap<String,String> valuesMap
        private ArrayList<String> valuesList;
    
    }
    

    当你实例化你的地图时:

    Map<String,YourOwnObject>
    

    如果你走这条路,你可以自由地做任何事

  3. # 3 楼答案

    那么:

    Map<String, Map<Class<?>, Object>> valuesByTypeByKey;
    

    获取时,提供keytype

    public <T> T fetch(String key, Class<T> type) {
        return (T)valuesByTypeByKey.getOrDefault(key, Collections.emptyMap()).get(type);
    }
    

    插入的工作原理如下:

    public <T> void insert(String key, Class<T> type, T value) {
        valuesByTypeByKey.computeIfAbsent(key, k -> new HashMap<>()).put(type, value);
    }