Map<String, List<String>>我的代码中有一个,如果map的#get()方法返回一个空列表而不是null ,我会避免使用潜在的空指针.java API中有这样的东西吗?我应该延长HashMap吗?
Jef*_*rey 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"
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 25
@ Jon的回答是直接做你要求的好方法.
但令我感到震惊的是,您可能尝试实施的是"多图"; 即从键到值集合的映射.如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类.
看着:
com.google.common.collect.Multimap界面和它的实施方式中,或org.apache.commons.collections.MultiMap界面和它的实现.org.apache.commons.collections4.MultiMap界面和它的实施方式中(先前multimap中的一个新版本;在V4中引入).Jon*_*eet 24
如评论中所述:
番石榴的计算地图概念被取代了
LoadingCache.另外java 8介绍了Map接口不错的computeIfAbsent默认方法,它不会破坏地图合约并具有延迟评估功能.
Guava有一个"计算地图"的想法,如果它不存在,它将执行一个提供值的函数.它是在MapMaker.makeComputingMap; 您现在可以使用CacheBuilder- 请参阅CacheBuilder.build更多详细信息.
这可能是矫枉过正你以后-你可能会更好只写Map它的实现有一个Map(使用成分而不是扩展任何特定的实现),然后就返回默认值,如果它不存在.除了get可能只委托给其他地图之外的每个方法:
public class DefaultingMap<K, V> implements Map<K, V>
{
private final Map<K, V> map;
private final V defaultValue;
public DefaultingMap(Map<K, V> map, V defaultValue)
{
this.map = map;
this.defaultValue = defaultValue;
}
@Override public V get(Object key)
{
V ret = map.get(key);
if (ret == null)
{
ret = defaultValue;
}
return ret;
}
@Override public int size()
{
return map.size();
}
// etc
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*rey 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;
}
};
Run Code Online (Sandbox Code Playgroud)
番石榴有一种方法可以完全按照你的意愿去做.它类似于Argote的答案.
Map<String, List<String>> myMap = ...
Functions.forMap(myMap, Arrays.asList("default", "value"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24534 次 |
| 最近记录: |