方便 class 处理 Map<K, List<V>>
Convenience class for handling Map<K, List<V>>
在我从事的各种项目中,我发现了类似
的模式
Map<Integer, List<String>> listMap = new HashMap<Integer, List<String>>();
public void addValue(Integer key, String value) {
if (!listMap.containsKey(key)) {
listMap.put(key, new ArrayList<String>());
}
listMap.get(key).add(value);
}
填充具有 Lists
作为值的地图。
因为这是一个很常见的模式,所以我想知道标准库中是否没有一些便利 class 或者类似 guava 的东西可以管理向该结构添加和删除值。
Guava 提供Multimap
,非常适合您的用途:
ListMultimap<Integer, String> listMap = ArrayListMultimap.create();
public void addValue(Integer key, String value) {
listMap.put(key, value);
}
public List<String> getValues(Integer key) {
return listMap.get(key);
}
public Map<Integer, List<String>> asMap() {
// See documentation for details
return Multimaps.asMap(listMap);
}
Java 8 还提供了一种在单个语句中获取和初始化值的更方便的方法:
Map<Integer, List<String>> listMap = new HashMap<>();
public void addValue(Integer key, String value) {
listMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
附带说明一下,我会稍微修改您的原始示例以避免在找到匹配键时进行额外查找:
public void addValue(Integer key, String value) {
List<String> values = listMap.get(key);
if (values == null) {
listMap.put(key, values = new ArrayList<>());
}
values.add(value);
}
在我从事的各种项目中,我发现了类似
的模式Map<Integer, List<String>> listMap = new HashMap<Integer, List<String>>();
public void addValue(Integer key, String value) {
if (!listMap.containsKey(key)) {
listMap.put(key, new ArrayList<String>());
}
listMap.get(key).add(value);
}
填充具有 Lists
作为值的地图。
因为这是一个很常见的模式,所以我想知道标准库中是否没有一些便利 class 或者类似 guava 的东西可以管理向该结构添加和删除值。
Guava 提供Multimap
,非常适合您的用途:
ListMultimap<Integer, String> listMap = ArrayListMultimap.create();
public void addValue(Integer key, String value) {
listMap.put(key, value);
}
public List<String> getValues(Integer key) {
return listMap.get(key);
}
public Map<Integer, List<String>> asMap() {
// See documentation for details
return Multimaps.asMap(listMap);
}
Java 8 还提供了一种在单个语句中获取和初始化值的更方便的方法:
Map<Integer, List<String>> listMap = new HashMap<>();
public void addValue(Integer key, String value) {
listMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
附带说明一下,我会稍微修改您的原始示例以避免在找到匹配键时进行额外查找:
public void addValue(Integer key, String value) {
List<String> values = listMap.get(key);
if (values == null) {
listMap.put(key, values = new ArrayList<>());
}
values.add(value);
}