返回默认值而不是null的Java Map实现

时间:2011-01-28 21:44:11

标签: java default

我的代码中有Map<String, List<String>>,如果地图的#get()方法返回空列表而不是null,我会避免使用潜在的空指针。 java API中有这样的东西吗?我应该延长HashMap吗?

6 个答案:

答案 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类。

看看:

答案 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是一个全局变量(为简单起见),如果这不是您想要的那样,那么您也可以将MapHashMap扩展为{{1}并且只包括这个额外的功能。这样,您就可以在实例化MyMap对象的任何地方使用它。