我正在寻找为HashMap get操作提供默认值的最佳方法(可读性和效率),但如果尚未出现值,还可以使用该默认值更新基础映射。
我知道有第三方库,但我更愿意坚持使用标准Java。下面是我想过的几种不同的方法:
老学校
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映射方法
// 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选项
List<Integer> integerList =
Optional.ofNullable(someIntegerListLookup.putIfAbsent(key, new ArrayList<>()))
.orElse(someIntegerListLookup.get(key));从可读性的角度看,不是这种方法的粉丝。
使用“否则”供应商:
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;
});现在,我倾向于以上解决方案是最好的选择。有没有其他(更好的)解决方案,我还没有想到,也没有遇到过?
发布于 2016-12-29 08:41:02
computeIfAbsent方法正是为此目的而设计的:
List<Integer> value =
someIntegerListLookup.computeIfAbsent("a", x -> new ArrayList<>());发布于 2016-12-29 08:40:46
如果密钥存在,您不想不必要地创建一个新的ArrayList。
因此,请使用:
List<Integer> integerList = someIntegerListLookup.computeIfAbsent(key, s -> new ArrayList<>());https://stackoverflow.com/questions/41375896
复制相似问题