好文推荐:
2.5万字讲解DDD领域驱动设计(史上最全DDD)
2.5万字详解23种设计模式(原理详解)
一文精通springboot+flowable工作流(最完整版本)
目录
1. 前言
平常我们在实际开发中最常用的map操作方法只有get,put方法,其实map还隐藏了很多个高级使用方法来帮助我们更好的进行代码开发!
2. getOrDefault
应用场景:当需要获取键对应的值,如果键不存在则返回默认值时。实际使用时,用getOrDefault方法代替get方法可以防止空指针。
代码示例:
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
String name = map.getOrDefault("3", "张飞");
System.out.println(name);
//输出结果:张飞
3. putIfAbsent
应用场景:当Map中不存在指定键时,才添加键值对,如果存在指定键时,不做任何操作。
代码示例:
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
map.putIfAbsent("1", "张飞");
System.out.println(map);
//输出结果:{1=刘备, 2=关羽}
map.putIfAbsent("3", "张飞");
System.out.println(map);
//输出结果:{1=刘备, 2=关羽, 3=张飞}
4. compute
应用场景:根据给定的键和值计算新的值,并更新Map中的键值对。如果键不存在,则插入新的键值对;如果键存在,则更新键值对。
代码示例:
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
// 使用compute方法更新键"a"的值
map.compute("a", (key, value) -> value == null ? 0 : value + 1);
System.out.println(map);
// 输出: {a=2, b=2}
// 如果键"c"不存在,则插入键"c"和值3
map.compute("c", (key, value) -> value == null ? 3 : value + 1);
System.out.println(map);
// 输出: {a=2, b=2, c=3}
5. computeIfAbsent
应用场景:computeIfAbsent方法用于在键不存在时计算其值,并将结果插入Map中。如果键已经存在,则不会执行计算,并返回当前值。这可以避免显式的空值判断。
代码示例:
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
// 如果键"b"不存在,则计算其值并插入
map.computeIfAbsent("b", key -> key.length());
System.out.println(map);
// 输出: {a=1, b=1}
// 如果键"a"存在,则不进行任何操作
map.computeIfAbsent("a", key -> key.length());
System.out.println(map);
// 输出: {a=1, b=1}
6. computeIfPresent
应用场景:如果键存在,则重新计算其值。
代码示例
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
// 如果键"a"存在,则将其值加1
map.computeIfPresent("a", (key, value) -> value + 1);
System.out.println(map);
// 输出: {a=2, b=2}
// 如果键"c"不存在,则不进行任何操作
map.computeIfPresent("c", (key, value) -> value + 1);
System.out.println(map);
// 输出: {a=2, b=2}
7. merge
应用场景:merge方法用于将指定键的值与给定值合并。如果键不存在,则直接插入给定值;如果键存在,则使用BiFunction将当前值与给定值合并。
代码示例:
Map<String, Integer> map = new HashMap<>();
map.put("1", 50);
map.put("2", 60);
//如果key存在1,则求和,否则直接插入map
map.merge("1", 50, Integer::sum);
System.out.println(map);
8. replaceAll
应用场景:当需要批量替换Map中的值时。
代码示例:
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
//将map中的所有value都加上牛逼二字
map.replaceAll((k, v) -> v + "牛逼");
9. 使用Stream API进行复杂操作
应用场景:当需要对Map进行复杂的数据转换和处理时。
代码示例:
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
// 过滤、映射和收集结果到新的Map
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
// 过滤id为1的数据
Map<String, String> result = map.entrySet().stream()
.filter(entry -> entry.getKey().equals("1"))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
System.out.println(result);
//输出结果:{1=刘备}
10. 遍历map的最佳实践!
遍历Map有很多种方式,适合不同的场景,代码示例如下:
10.1 方式一:
应用场景:使用entrySet()遍历,示例代码:
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
for(Map.Entry<String, String>entry :map.entrySet()){
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
查询性能:这种方式直接获取键值对,避免了重复哈希查找,性能较好
10.2 方式二:
应用场景:使用keySet()方法遍历,通过key再取值value,示例如下
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println("Key: " + key + ", Value: " + value);
}
查询性能:这种方式需要两次哈希查找,第一次获取键,第二次获取值,相对较慢
10.3 方式三:
应用场景:只取map的value时,使用values()方法遍历,示例如下
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
for (String value : map.values()) {
System.out.println("Value: " + value);
}
查询性能:这种方式只遍历值,性能最好,但仅在只需要值的情况下适用
10.4 方式四
应用场景:使用迭代器Iterator遍历,性能好,特别是在需要遍历过程中进行删除操作时
Map<String, String> map = new HashMap<>();
map.put("1", "刘备");
map.put("2", "关羽");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
// 如果需要删除某个元素
if (entry.getValue() == "2") {
iterator.remove(); // 安全地删除当前元素
}
}
查询性能:这种方式通常效率最高,但是代码不够简洁
10.3 方式五:(推荐)
应用场景:适用于简单逻辑输出
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
查询性能:这种方式代码简洁,但性能略逊于entrySet()方法
10.4 方式六:(推荐)
应用场景:适用于需要进行复杂流式处理的场景,如过滤、映射等。
相关的stream流式编程可参考小编另一篇博客:jdk8之stream流式编程
代码示例:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.entrySet().stream().forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));
查询性能:这种方式代码简洁,但性能略逊于entrySet()方法
总结
通过这些高级技巧和最佳实践,可以使你的Map操作更加简洁、高效和易读,从而提升代码的逼格,更加方便的解决我们实际开发中的问题!!!
如果看到这里,说明你喜欢这篇文章,请转发,点赞。
- 关注公众号老板来一杯java
- 加群即可赠送DDD领域驱动设计实战落地解惑PDF一份!
- 公众号回复java即可获取java基础经典面试一份!
好文推荐:
推荐一款基于AI编程的代码自动生成工具Cursor,替代VSCode
2.5万字讲解DDD领域驱动设计(史上最全DDD)
python vs java,从java转python一键简简单单入门,轻轻松松上手,抓紧收藏起来吧