首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8:从HashMap获取默认值并更新基础映射

Java 8:从HashMap获取默认值并更新基础映射
EN

Stack Overflow用户
提问于 2016-12-29 08:35:25
回答 2查看 374关注 0票数 5

我正在寻找为HashMap get操作提供默认值的最佳方法(可读性和效率),但如果尚未出现值,还可以使用该默认值更新基础映射。

我知道有第三方库,但我更愿意坚持使用标准Java。下面是我想过的几种不同的方法:

老学校

代码语言:javascript
复制
Map<String, List<Integer>> someIntegerListLookup = new HashMap<>();
String key = "key";
...
List<Integer> integerList = someIntegerListLookup.get(key);

if (integerList == null) {
    integerList = new ArrayList<>();
    someIntegerListLookup.put(key, integerList);
}

Java 8映射方法

代码语言:javascript
复制
// getOrDefault
List<Integer> integerList = someIntegerListLookup.getOrDefault(key, new ArrayList<>());
someIntegerListLookup.put(key, integerList);

// putIfAbsent
someIntegerListLookup.putIfAbsent(key, new ArrayList<>());
List<Integer> integerList = someIntegerListLookup.get(key);

使用Java 8选项

代码语言:javascript
复制
List<Integer> integerList = 
    Optional.ofNullable(someIntegerListLookup.putIfAbsent(key, new ArrayList<>()))
    .orElse(someIntegerListLookup.get(key));

从可读性的角度看,不是这种方法的粉丝。

使用“否则”供应商:

代码语言:javascript
复制
List<Integer> integerList = Optional.ofNullable(someIntegerListLookup.get(key))
    .orElseGet(() -> {
        // Only runs if the map contains no value for the key
        List<Integer> defaultIntegersList = new ArrayList<>();
        someIntegerListLookup.put(key, defaultIntegersList);
        return defaultIntegersList;
    });

现在,我倾向于以上解决方案是最好的选择。有没有其他(更好的)解决方案,我还没有想到,也没有遇到过?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-29 08:41:02

computeIfAbsent方法正是为此目的而设计的:

代码语言:javascript
复制
List<Integer> value = 
    someIntegerListLookup.computeIfAbsent("a", x -> new ArrayList<>());
票数 5
EN

Stack Overflow用户

发布于 2016-12-29 08:40:46

如果密钥存在,您不想不必要地创建一个新的ArrayList

因此,请使用:

代码语言:javascript
复制
List<Integer> integerList = someIntegerListLookup.computeIfAbsent(key, s -> new ArrayList<>());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41375896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档