Java8中Map的新特性和常用方法
自从 java8 出了一些新特性之后紧接着也出了许多类的新方法例如 Map 在 java8 就新增了许多实用的方法,接下来慢慢介绍也顺便记录一下,可能有一部分人在看官方文档的介绍不是那么的理解或者是看其它博主的文章,我这里就用我所理解的方式来给大家分享一下我对 java8 新增的 Map 方法的理解,首先来看第一个
getOrDefault
可能你们在实际的业务开发当中会使用到 Map 当你想要获取 Map 当中某个 key 的 value 时在之前的写法就是 map.get("BNTang");
在 java8 当中提供了一个 getOrDefault
意思就是说:从 Map 当中获取 key 为 BNTang
的 value 值,如果存在该 BNTang
key 则返回该 key 对应的 value,如果该 BNTang
key 不存在,返回第二个形参指定的值这样的写法好处就是可以避免 空指针异常
,如果使用之前的方式获取很有可能会返回一个 null 这就会导致你的程序出现异常
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
Integer result = map.getOrDefault("BNTang", 666);
System.out.println(result);
}
}
merge
merge() 方法会先判断指定的 key 是否存在,如果不存在,则添加键值对到 hashMap 中。语法如下,注:hashmap 是 HashMap 类的一个对象。
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
...
}
参数说明
- key:键
- value:值
- remappingFunction:重新映射函数,用于重新计算值
返回值
如果 key 对应的 value 不存在,则返回该 value 值,如果存在,则返回通过 remappingFunction 重新计算后的值。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.merge(k, v, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer v1, Integer v2) {
return v1 + v2;
}
});
});
System.out.println(targetMap);
}
}
结果如下
{ww=4, BNTang=2, Jonathan_Lee=2, ls=9, zs=2}
compute
compute() 方法对 hashMap 中指定 key 的值进行重新计算。compute() 方法的语法为:
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
}
注:hashmap 是 HashMap 类的一个对象。
参数说明
- key:键
- remappingFunction:重新映射函数,用于重新计算值
返回值
如果 key 对应的 value 不存在,则返回该 null,如果存在,则返回通过 remappingFunction 重新计算后的值,如果不存在这个 key,则添加到 hasMap 中。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.compute(k, new BiFunction<String, Integer, Integer>() {
@Override
public Integer apply(String s, Integer v1) {
return null != v1 ? v1 + v : v;
}
});
});
System.out.println(targetMap);
}
}
结果如下
{ww=4, BNTang=2, Jonathan_Lee=2, ls=9, zs=2}
computeIfPresent
computeIfPresent() 方法对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。computeIfPresent() 方法的语法为:
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
}
注:hashmap 是 HashMap 类的一个对象。
参数说明
- key:键
- remappingFunction:重新映射函数,用于重新计算值
返回值
如果 key 对应的 value 不存在,则返回该 null,如果存在,则返回通过 remappingFunction 重新计算后的值。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.computeIfPresent(k, new BiFunction<String, Integer, Integer>() {
@Override
public Integer apply(String s, Integer v1) {
return v1 + v;
}
});
});
System.out.println(targetMap);
}
}
结果如下
{Jonathan_Lee=2, ls=9, zs=2}
computeIfAbsent
computeIfAbsent() 方法对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中。computeIfAbsent() 方法的语法为:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
...
}
注:hashmap 是 HashMap 类的一个对象。
参数说明
- key:键
- mappingFunction:重新映射函数,用于重新计算值
返回值
如果 key 对应的 value 不存在,则使用获取 mappingFunction 重新计算后的值,并保存为该 key 的 value,否则返回 value。
/**
* @author BNTang
*/
public class Test {
public static void main(String[] args) {
Map<String, Integer> currentMap = new HashMap<>();
currentMap.put("BNTang", 2);
currentMap.put("zs", 1);
currentMap.put("ls", 3);
currentMap.put("ww", 4);
Map<String, Integer> targetMap = new HashMap<>();
targetMap.put("Jonathan_Lee", 2);
targetMap.put("zs", 1);
targetMap.put("ls", 6);
currentMap.forEach((k, v) -> {
targetMap.computeIfAbsent(k, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return v;
}
});
});
System.out.println(targetMap);
}
}
结果如下:
{ww=4, BNTang=2, Jonathan_Lee=2, ls=6, zs=1}
如上的代码没有使用 lambda 表达式去简化方便你们查看
- 目前慢慢记录,持续更新,如有不正确,还请大佬们指正🐤
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具