前言
在 Jdk 8 中 Map 接口提供了一些新的便利的方法。因为在本文中我所提到的所有 Map 方法都是以默认值方法的方式实现的,所以现有的 Map 接口的实现可以直接拥有这些在默认值方法中定义的默认行为,而不需要新增一行代码。本文涵盖的 Jdk 8 中引进的 Map 方法有:getOrDefault(Object, V),putIfAbsent(K, V),remove(Object, Object),replace(K, V),andreplace(K, V, V)。
Map 范例
Map.getOrDefault(Object key, V defaultValue)
Map 的新方法 getOrDefault(Object key, V defaultValue) 允许调用者在代码语句中规定获得在 map 中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个 “默认值”。
1 | default V getOrDefault(Object key, V defaultValue) { |
Map.putIfAbsent(K key, V value)
Map 的新方法 putIfAbsent(K key, V value) 允许调用者在代码语句中规定添加在 map 中符合提供的键的值,若 map 中有对应 K 映射的 V 且不为 null 则直接返回,否则执行 put。
1 | default V putIfAbsent(K key, V value) { |
Map.computeIfAbsent(K key, Function< ? super K, ? extends V> mappingFunction)
Map.computeIfAbsent 方法原型 V computeIfAbsent(K key, Function< ? super K, ? extends V> mappingFunction),如果指定的 key 不存在或相关的 value 为 null 时,设置 key 与关联一个计算出的非 null 值,计算出的值为 null 的话什么也不做(不会去删除相应的 key)。如果 key 存在并且对应 value 不为 null 的话什么也不做。同样,方法的返回值也是最终的 map.get(key)。
1 | default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { |
Map.computeIfPresent(K key, BiFunction< ? super K, ? super V, ? extends V> remappingFunction)
Map.computeIfPresent 方法原型 V computeIfPresent(K key, BiFunction< ? super K, ? super V, ? extends V> remappingFunction),如果指定的 key 存在并且相关联的 value 不为 null 时,根据旧的 key 和 value 计算 newValue 替换旧值,newValue 为 null 则从 map 中删除该 key;key 不存在或相应的值为 null 时则什么也不做,方法的返回值为最终的 map.get(key)。
1 | default V computeIfPresent(K key, |
Map.remove(Object key, Object value)
Map 的新方法 remove(Object key, Object value) 超越了长期有效的 Map.remove(Object key)方法,只有在提供的键和值都匹配的时候才会删除该 map 项(之前的有效版本只是查找 “键” 的匹配来删除)。
1 | default boolean remove(Object key, Object value) { |
Map.replace(K key, V value) / Map.replace(K key, V oldValue, V newValue)
Map.replace(K key, V value) 方法只有在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值)。
1 | default V replace(K key, V value) { |
Map.replace(K key, V oldValue, V newValue) 方法接受一个额外的(第三个)参数,只有在指定的键和值都匹配的情况下才会替换。
1 | default boolean replace(K key, V oldValue, V newValue) { |
Map.merge(K key, V value, BiFunction< ? super V, ? super V, ? extends V> remappingFunction)
Map.merge(K key, V value, BiFunction< ? super V, ? super V, ? extends V> remappingFunction) 方法,如果指定的 key 不存在,或相应的值为 null 时,则设置 value 为相关联的值。否则根据 key 对应的旧值和 value 计算出新的值 newValue,newValue 为 null 时,删除该 key,否则设置 key 对应的值为 newValue。方法的返回值也是最终的 map.get(key) 值。
1 | default V merge(K key, V value, |
Map.forEach(BiConsumer< ? super K, ? super V> action)
Map.forEach(BiConsumer< ? super K, ? super V> action) 方法用于遍历 map。
1 | // JDK8 之前的实现方式 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式 |
Map.sorted
Map.sorted 方法用于排序 map。
1 | /** |
参考博文
[1]. Handy New Map Default Methods in JDK 8
[2]. Java8 之 Stream/Map
[3]. Java8 Map 中新增的方法使用总结
Java8 那些事儿系列
- Java8 那些事儿(一):Stream 函数式编程
- Java8 那些事儿(二):Optional 类解决空指针异常
- Java8 那些事儿(三):Date/Time API(JSR 310)
- Java8 那些事儿(四):增强的 Map 集合
- Java8 那些事儿(五):函数式接口
- Java8 那些事儿(六):从 CompletableFuture 到异步编程