在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 |