哪种风格更适合经典的动态编程if-not-contain-then-put?

0 java performance dynamic-programming

在动态编程问题中,有一个包含先前案例的地图是很正常的,每次到达新状态时,都必须检查它是否已经在地图中,如果是,则使用它,如果不是,则添加它.我想知道这两种方式之间在性能和风格方面有什么好处:

Value value;
if(!map.contains(key)){
    value = calculateValue();
    map.put(key, value);
} else {
    value = map.get(key);
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

if(!map.contains(key)){
    map.put(key, calculateValue());
}
Value value = map.get(key);
Run Code Online (Sandbox Code Playgroud)

第二个似乎效率较低,但允许我避免使用可能导致错误的未初始化变量.

Gia*_*tta 5

最可读的方式是Map.computeIfAbsent.它在缺少值时才添加函数调用,这应该可以忽略不计.

代码看起来像:

final Value value = map.computeIfAbsent(key, k -> calculateValue());
Run Code Online (Sandbox Code Playgroud)