Java 中的 HashMap.merge() 方法详解
在日常 Java 编程中,我们经常会遇到以下场景:
“如果某个 key 存在,则对它的 value 进行某种操作;如果不存在,则设置一个默认值。”
传统的做法通常需要一系列 containsKey()
判断、get()
和 put()
操作,这种方式不仅繁琐,而且容易出错。幸运的是,Java 8 为我们提供
一、merge()
方法简介
merge()
是 Java 8 在 Map
接口中新增的默认方法,其设计初衷是以函数式编程方式处理键值对的合并逻辑,可以极大地简化代码量。
方法定义:
default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction);
工作机制
如果
key
不存在或映射值为null
,则直接put(key, value)
。如果
key
存在且映射值不为null
,则使用remappingFunction
合并旧值与新值,结果再放入 map。如果
remappingFunction
返回null
,该键值对将被移除。
二、参数含义解析
参数名称 | 含义 |
---|---|
key | 要插入或合并的键 |
value | 新的默认值(当 key 不存在时使用) |
remappingFunction | 合并逻辑函数(当 key 存在时使用) |
三、实际使用示例
实例一:(Java自带的方式的写法)
import java.util.HashMap;
import java.util.Map;public class MergeDemo {public static void main(String[] args) {Map<String, Integer> fruitCount = new HashMap<>();fruitCount.put("苹果", 2);// 如果“苹果”存在,则加上新值;否则设为新值fruitCount.merge("苹果", 3, Integer::sum);fruitCount.merge("香蕉", 1, Integer::sum);System.out.println(fruitCount);// 输出:{苹果=5, 香蕉=1}}
}
实例一:(lamda表达式的写法)
import java.util.HashMap;
import java.util.Map;public class MergeDemo {public static void main(String[] args) {Map<String, Integer> fruitCount = new HashMap<>();fruitCount.put("苹果", 2);// 如果“苹果”存在,则加上新值;否则设为新值fruitCount.merge("苹果", 3, (oldVal,newVal)+oldVal+newVal);fruitCount.merge("香蕉", 1, (oldVal,newVal)+oldVal+newVal);System.out.println(fruitCount);// 输出:{苹果=5, 香蕉=1}}
}
实例二、
Map<String, String> greetings = new HashMap<>();
greetings.put("张三", "你好");greetings.merge("张三", ",早上好", String::concat);
greetings.merge("李四", "您好", String::concat);System.out.println(greetings);
// 输出:{张三=你好,早上好, 李四=您好}