在动态编程问题中,拥有包含先前案例的映射是很正常的,每次到达新状态时,都必须检查它是否已经存在于映射中,如果使用,则使用它,如果不添加它。我想知道这两种方式之间在性能和样式上哪个更好:
Value value;
if(!map.contains(key)){
value = calculateValue();
map.put(key, value);
} else {
value = map.get(key);
}
和这个:
if(!map.contains(key)){
map.put(key, calculateValue());
}
Value value = map.get(key);
第二个似乎效率不高,但是我可以避免使用未初始化的变量,该变量有一天可能导致错误。
答案 0 :(得分:5)
最易读的方式是Map.computeIfAbsent
。当值不存在时,它将添加仅 的函数调用,该函数调用可以忽略不计。
代码如下:
final Value value = map.computeIfAbsent(key, k -> calculateValue());