自從 java8 出了一些新特性之后緊接着也出了許多類的新方法例如 Map 在 java8 就新增了許多實用的方法,接下來慢慢介紹也順便記錄一下,可能有一部分人在看官方文檔的介紹不是那么的理解或者是看其它博主的文章,我這里就用我所理解的方式來給大家分享一下我對 java8 新增的 Map 方法的理解,首先來看第一個
getOrDefault
可能你們在實際的業務開發當中會使用到 Map 當你想要獲取 Map 當中某個 key 的 value 時在之前的寫法就是 map.get("BNTang"); 在 java8 當中提供了一個 getOrDefault 意思就是說:從 Map 當中獲取 key 為 BNTang 的 value 值,如果存在該 BNTang key 則返回該 key 對應的 value,如果該 BNTang key 不存在,返回第二個形參指定的值這樣的寫法好處就是可以避免 空指針異常,如果使用之前的方式獲取很有可能會返回一個 null 這就會導致你的程序出現異常
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
Integer result = map.getOrDefault("BNTang", 666);
System.out.println(result);
}
}
merge
merge() 方法會先判斷指定的 key 是否存在,如果不存在,則添加鍵值對到 hashMap 中。語法如下,注:hashmap 是 HashMap 類的一個對象。
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
...
}
參數說明
- key:鍵
- value:值
- remappingFunction:重新映射函數,用於重新計算值
返回值
如果 key 對應的 value 不存在,則返回該 value 值,如果存在,則返回通過 remappingFunction 重新計算后的值。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.merge(k, v, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer v1, Integer v2) {
return v1 + v2;
}
});
});
System.out.println(targetMap);
}
}
結果如下
{ww=4, BNTang=2, Jonathan_Lee=2, ls=9, zs=2}
compute
compute() 方法對 hashMap 中指定 key 的值進行重新計算。compute() 方法的語法為:
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
}
注:hashmap 是 HashMap 類的一個對象。
參數說明
- key:鍵
- remappingFunction:重新映射函數,用於重新計算值
返回值
如果 key 對應的 value 不存在,則返回該 null,如果存在,則返回通過 remappingFunction 重新計算后的值,如果不存在這個 key,則添加到 hasMap 中。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.compute(k, new BiFunction<String, Integer, Integer>() {
@Override
public Integer apply(String s, Integer v1) {
return null != v1 ? v1 + v : v;
}
});
});
System.out.println(targetMap);
}
}
結果如下
{ww=4, BNTang=2, Jonathan_Lee=2, ls=9, zs=2}
computeIfPresent
computeIfPresent() 方法對 hashMap 中指定 key 的值進行重新計算,前提是該 key 存在於 hashMap 中。computeIfPresent() 方法的語法為:
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
}
注:hashmap 是 HashMap 類的一個對象。
參數說明
- key:鍵
- remappingFunction:重新映射函數,用於重新計算值
返回值
如果 key 對應的 value 不存在,則返回該 null,如果存在,則返回通過 remappingFunction 重新計算后的值。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.computeIfPresent(k, new BiFunction<String, Integer, Integer>() {
@Override
public Integer apply(String s, Integer v1) {
return v1 + v;
}
});
});
System.out.println(targetMap);
}
}
結果如下
{Jonathan_Lee=2, ls=9, zs=2}
computeIfAbsent
computeIfAbsent() 方法對 hashMap 中指定 key 的值進行重新計算,如果不存在這個 key,則添加到 hasMap 中。computeIfAbsent() 方法的語法為:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
...
}
注:hashmap 是 HashMap 類的一個對象。
參數說明
- key:鍵
- mappingFunction:重新映射函數,用於重新計算值
返回值
如果 key 對應的 value 不存在,則使用獲取 mappingFunction 重新計算后的值,並保存為該 key 的 value,否則返回 value。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.computeIfAbsent(k, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return v;
}
});
});
System.out.println(targetMap);
}
}
結果如下:
{ww=4, BNTang=2, Jonathan_Lee=2, ls=6, zs=1}
如上的代碼沒有使用 lambda 表達式去簡化方便你們查看
- 目前慢慢記錄,持續更新,如有不正確,還請大佬們指正🐤
