我的应用程序需要一个多值映射,该键的键具有2种类型的值,例如List和String。 Map可以基于类型参数返回所有值或单个值,如get(key,type)一样。
在spring或apache多值地图中都找不到这样的功能。 是否有其他图书馆提供这种数据结构,还是我必须实现自己的图书馆?
答案 0 :(得分:0)
创建自己的对象
public class YourOwnObject {
private HashMap<String,String> valuesMap
private ArrayList<String> valuesList;
}
以及当您实例化地图时:
Map<String,YourOwnObject>
如果您采用这种方式,您可以自由地做任何事情
答案 1 :(得分:0)
在Java 8中使用带有期望值的lamda表达式添加多图有点容易。这是示例代码。您可以尝试一下。
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()方法采用A键和lambda。如果该密钥不存在,则运行executeIfAbsent()并创建新的HashMap。
如果发现键为空,则getOrDefault()方法将返回值或返回空集。
要使用此
TestMultiMap<String,Object> testMultiMap = new TestMultiMap<>();
testMultiMap.put("Key 1", new Object());
testMultiMap.put("Key 2", "String 1");
testMultiMap.put("Key 3", 1);
答案 2 :(得分:0)
怎么样:
Map<String, Map<Class<?>, Object>> valuesByTypeByKey;
获取时,请提供key
和type
:
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);
}