Java:HashMap:获取:指定默认值
在Python中,我可以这样做:
d = { 'a': True, 'b': False }
print d.get('x', True)
这会打印出
True
在Java中,HashMap.get
方法没有第二个参数来指定默认值。那么,有什么简单明了的方法可以实现这个功能呢?我觉得下面这个写法有点多余:
map.containsKey("x") ? map.get("x") : true
9 个回答
2
我觉得...
Object o = map.get("x");
if(o == null)
o = BOOLEAN.TRUE;
... 这个方法是最简单易懂且高效的做法。这样你只需要查找一次地图(数据)。可惜的是,“Java”和“简洁”这两个词一般不太能放在一起,除非是用来表达不好的意思。
6
楼主修改了他的问题,不过我还是把答案留着以备不时之需。
你应该使用
map.containsKey("x")
而不是
map.get("x") != null
来检查地图中是否有某个键的映射。
在地图中,null可以作为有效的映射值。
对于Python也是一样。仅仅测试dict[key]是否等于None,并不能确定这个键是否映射到了某个值。
快速测试:
d = {'a': None}
# returns True
d['a'] == None
# raises KeyError
d['b']
# returns 'Whatever'
d.get('b', 'Whatever')
所以Java中与Python的dict.get()相对应的是
map.containsKey("x") ? map.get("x") : default_value
正如楼主所说的那样。
0
这两种写法都是错的,因为它们会进行两次查找。一般来说,你应该这样做:
Boolean ret = map.get("x");
if (ret == null) {
return true
}
return ret;
你可以把这个放在一个函数里。
public static <K,V> V mapGet(Map<K, V> map, K key, V defaultValue) {
V ret = map.get(key);
if (ret == null) {
return defaultValue;
}
return ret;
}
如果你想的话,可以让它变成非静态的。如果你是自己创建这个地图对象(也就是说不是从外部代码获取的),你可以继承哈希表。如果一个API返回了地图实例,那你就不能使用继承了。
public class MyHashMap<K,V> extends HashMap<K,V> {
public V get(K key, V default) {
V ret = get(key);
if (ret == null) {
return defaultValue;
}
return ret;
}
}