Java:HashMap:获取:指定默认值

3 投票
9 回答
7820 浏览
提问于 2025-04-17 07:13

在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;
    }
}

撰写回答