譯者:kingviker
Map在Java8中新增了兩個replace的方法
1.replace(k,v)
在指定的鍵已經存在並且有與之相關的映射值時纔會將指定的鍵映射到指定的值(新值)
在指定的鍵不存在時,方法會return回來一個null
javadoc的註釋解釋了該默認值方法的實現的等價java代碼:
if (map.containsKey(key)) {
return map.put(key, value);
} else {
return null;
}
下面展示的是新方法和JDK8之前的方法比較:
/*
* 示範Map.replace(K, V)方法並和JDK8之前的實現方法做對比。JDK8
* 中新增的Map.replace(K, V)方法相比於傳統的實現方法,所用的代碼行數更少
* 並且允許用一個final類型的變量來接收返回值。
*/
// JDK8之前的實現方式
String replacedCapitalCity;
if (statesAndCapitals.containsKey("Alaska")) {
replacedCapitalCity = statesAndCapitals.put("Alaska", "Juneau");
}
// JDK8的實現方式
final String replacedJdk8City = statesAndCapitals.replace("Alaska", "Juneau");
2.replace(k,v,v)
第二的新增的Map replace方法在替換現存值方面有更窄的釋義範圍。當那個方法(上一個replace方法)只是涵蓋指定的鍵在映射中有任意一個有效的值的替換處理,而這個“replace”方法接受一個額外的(第三個)參數,只有在指定的鍵和值都匹配的情況下才會替換。
javadoc註釋說明了該默認值方法的實現:
if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
map.put(key, newValue);
return true;
} else {
return false;
}
下面這段代碼列舉展示的是新實現方法和JDK8之前的實現方法的一個具體比較。
/*
* 示範Map.replace(K, V, V)方法並和JDK8之前的實現方法做對比。JDK8
* 中新增的Map.replace(K, V, V)方法相比於傳統的實現方法,所用的代碼行數更少
* 並且允許用一個final類型的變量來接收返回值。
*/
// JDK8之前的實現方式
boolean replaced = false;
if ( statesAndCapitals.containsKey("Nevada")
&& Objects.equals(statesAndCapitals.get("Nevada"), "Las Vegas")) {
statesAndCapitals.put("Nevada", "Carson City");
replaced = true;
}
// JDK8的實現方式
final boolean replacedJdk8 = statesAndCapitals.replace("Nevada", "Las Vegas", "Carson City");