在Java 8中的Map.Entry接口中增加了comparingByKey, comparingByValue方法,它們都返回Comparator<Map.Entry<K,V>>, Comparator是一個函數接口,主要是方便Lambda表達式的使用。
在Java 8中的Map接口增加了一些default方法,提升了對key, value操作的便利性。下面是基本數據的定義,通過這些數據說明新增的一些方法。
1 |
Map<Integer, String> map = new HashMap<>(); |
getOrDefault 方法
如果指定的key存在,則返回該key對應的value,如果不存在,則返回指定的值。例子如下
1 |
// key為4不存在,輸出 d |
forEach 方法
遍歷Map中的所有Entry, 對key, value進行處理, 接收參數 (K, V) -> void, 例子如下
1 |
// 輸出1a, 2b, 3c |
replaceAll 方法
替換Map中所有Entry的value值,這個值由舊的key和value計算得出,接收參數 (K, V) -> V, 類似如下代碼
1 |
for (Map.Entry<K, V> entry : map.entrySet()) |
例如如下:
1 |
map.replaceAll((key, value) -> (key + 1) + value); |
putIfAbsent 方法
如果key關聯的value不存在,則關聯新的value值,返回key關聯的舊的值,類似如下代碼
1 |
V v = map.get(key); |
示例代碼如下:
1 |
map.putIfAbsent(3, "d"); |
remove 方法
接收2個參數,key和value,如果key關聯的value值與指定的value值相等(equals),則刪除這個元素,類似代碼如下:
1 |
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { |
示例代碼如下:
1 |
map.remove(1, "b"); |
replace(K key, V oldValue, V newValue) 方法
如果key關聯的值與指定的oldValue的值相等,則替換成新的newValue,類似代碼如下:
1 |
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { |
示例代碼如下
1 |
map.replace(3, "a", "z"); |
replace(K key, V value) 方法
如果map中存在key,則替換成value值,否則返回null, 類似代碼如下:
1 |
if (map.containsKey(key)) { |
示例代碼如下:
1 |
// 輸出舊的值, a |
computeIfAbsent 方法
如果指定的key不存在,則通過指定的K -> V計算出新的值設置為key的值,類似代碼如下:
1 |
if (map.get(key) == null) { |
示例代碼如下:
1 |
map.computeIfAbsent(1, key -> key + " computed"); |
computeIfPresent 方法
如果指定的key存在,則根據舊的key和value計算新的值newValue, 如果newValue不為null,則設置key新的值為newValue, 如果newValue為null, 則刪除該key的值,類似代碼如下:
1 |
if (map.get(key) != null) { |
示例代碼如下:
1 |
map.computeIfPresent(1, (key, value) -> (key + 1) + value); |
compute 方法
compute方法是computeIfAbsent與computeIfPresent的綜合體。
merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) 方法
如果指定的key不存在,則設置指定的value值,否則根據key的舊的值oldvalue,value計算出新的值newValue, 如果newValue為null, 則刪除該key,否則設置key的新值newValue。類似如下代碼:
1 |
V oldValue = map.get(key); |
示例代碼如下:
1 |
// 存在key為1, 輸出 a merge |
