我的代码中有Map<String, List<String>>
,如果地图的#get()
方法返回空列表而不是null,我会避免使用潜在的空指针。 java API中有这样的东西吗?我应该延长HashMap
吗?
答案 0 :(得分:31)
感谢default
方法,Java 8现在内置了Map::getOrDefault
:
Map<Integer, String> map = ...
map.put(1, "1");
System.out.println(map.getOrDefault(1, "2")); // "1"
System.out.println(map.getOrDefault(2, "2")); // "2"
答案 1 :(得分:24)
如评论中所述:
Guava的计算地图概念被
LoadingCache
取代。另外java 8引入了Map接口不错的computeIfAbsent
默认方法,它不会破坏地图合约并具有延迟评估功能。
Guava有一个“计算地图”的概念,如果它不存在,它将执行一个提供值的函数。它是在MapMaker.makeComputingMap
中实施的;您现在可以使用CacheBuilder
- 有关详细信息,请参阅CacheBuilder.build
。
对于您所追求的内容可能有点过头了 - 您可能最好只编写 Map
的{{1}}实现(使用合成而不是扩展任何内容)特定的实现)然后只是返回默认值,如果它不存在。除Map
之外的每个方法都可能只委托给其他地图:
get
答案 2 :(得分:24)
@ Jon的答案是直接做你要求的好方法。
但令我感到震惊的是,您可能尝试实施的是“多图”;即从键到值集合的映射。如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类。
看看:
com.google.common.collect.Multimap
接口及其实现,或org.apache.commons.collections.MultiMap
接口及其实现。 org.apache.commons.collections4.MultiMap
接口及其实现(以前的MultiMap的新版本;在v4中引入)。答案 3 :(得分:10)
与之前的帖子类似,但如果您想要更改其行为,则可以覆盖get方法。
Map<String, List<String>> map = new LinkedHashMap<String, List<String>>() {
public String get(Object key) {
List<String> list = super.get(key);
if (list == null && key instanceof String)
super.put(key, list = new ArrayList<String>());
return list;
}
};
答案 4 :(得分:7)
Guava有一种方法可以完全按照自己的意愿行事。它类似于Argote's answer。
Map<String, List<String>> myMap = ...
Functions.forMap(myMap, Arrays.asList("default", "value"));
答案 5 :(得分:0)
在我看来,您可以简单地编写一个包装函数来获取您想要的值,如果它是null
则返回默认值。
Map<String, List<String>> myMap = new Map<String, List<String>>();
public List<String> myGet(String key) {
List<String> ret = myMap.get(key);
if(ret == NULL) {
return defaultList(); // where defaultList is a function that generates your default list.
}
return ret;
}
这假设您的myMap
是一个全局变量(为简单起见),如果这不是您想要的那样,那么您也可以将Map
或HashMap
扩展为{{1}并且只包括这个额外的功能。这样,您就可以在实例化MyMap
对象的任何地方使用它。