一、介绍
首先先来看看JDK8文档对其的方法说明描述。
方法的字面意思为:如果存在就进行compute(计算)
如果看了上面的文档描述你还不是很懂的话,可以先看下的例子,然后回过头再看上面的说明,你就会明白。
二、使用
我们还是结合的具体的案例来说明,这样好理解。
我们假设有这样一个javaBean对象,其中有id,name,age,hobby四个字段的值。现在我们假设有一个对其新增/修改的接口,要实现的javaBean对象中的修改新值的热替换,而非全部替换,其实这样的需求很常见。举个例子:假如说我们现在有一个User对象,数据库中其id,name, age,hobby 的值分别是:1001, "张三”, 22, “篮球”。而我们这样一个对象提供了一个修改的接口,每次修改只需要把修改的字段名和字段值及id传递过来,我们后台做到动态修改值修改的对象,其余值保存原有值。这样的对象,我们使用HashMap来表示。
public class Main {
public static void main(String[] args) {
// 原对象
Map<String, Object> oldUser = new HashMap<String, Object>(){{
put("id", 1001);
put("name", "张三");
put("age", 22);
put("hobby", "篮球");
}};
// 新对象
Map<String, Object> newUser = new HashMap<String, Object>(){{
put("id", 1001);
put("age", 23);
put("hobby", "足球");
}};
System.out.println("oldUser -> " + oldUser);
// 新对象的k-v集合
Set<Map.Entry<String, Object>> entries = newUser.entrySet();
// 循环新对象的Map集合,将其与老的对象的集合进行对比。
// 如果新修改的键值,在老对象的中存在,将使用新集合的值替换老集合的值
// 否则保持原有的老值不变。
for (Map.Entry<String, Object> entry : entries) {
oldUser.computeIfPresent(entry.getKey(), (k, v) -> {
if (oldUser.containsKey(k)) {
// 进行新值替换老值操作
return entry.getValue();
}
// 保存原值,如果这里固定返回null,则表示在删除对象的key-value.
return v;
});
}
System.out.println("--------------------经过替换过--------------------------");
System.out.println("oldUser - > " + oldUser);
}
}
代码运行结果如下:
oldUser -> {name=张三, id=1001, age=22, hobby=篮球}
--------------------经过替换过--------------------------
oldUser - > {name=张三, id=1001, age=23, hobby=足球}
其实不难看出,computeIfPresent其实compute的一种特殊情况,compute一般包括两种情况:一种key对应的值在map中存在;另一种则是key对应的值在map中不存在。之所以分两种情况,是因为我们实际中往往需要针对这两种情况做不同的操作处理。
比如拿上面的例子说明,只有当user的值被修改时,我们才会替换原有对象的相应的key的值,否则就保持不变。在实际项目中,往往还有更多的情况,比如说,在替换旧值是,做个和运算或者统一加个前缀等等。
标题
如果不理解第二个参数BiFunction<? super K, ? super V, ? extends V> remappingFunction
或者compute
方法的,请查看我的前一篇文章。Java基础之Java8中Map的compute的使用
三、总结
- 值得我们注意的是,在computeIfPresent中,如果我们返回null,则表示在map中移除对应的key-value键值对。
结果如下:发现name在map中已经不存在了。public class Main { public static void main(String[] args) { // 原对象 Map<String, Object> map = new HashMap<String, Object>(){{ put("id", 1001); put("name", "张三"); put("age", 22); put("hobby", "篮球"); }}; System.out.println("map -> " + map); System.out.println("-------------运算后-------------------"); map.computeIfPresent("name", (k, v) -> { return null; }); System.out.println("map -> " + map); } }
map -> {name=张三, id=1001, age=22, hobby=篮球} -------------运算后------------------- map -> {id=1001, age=22, hobby=篮球}