我的创作纪念日-Map之骚操作提高逼格和最佳实践

好文推荐:
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操作更加简洁、高效和易读,从而提升代码的逼格,更加方便的解决我们实际开发中的问题!!!

如果看到这里,说明你喜欢这篇文章,请转发,点赞。

  1. 关注公众号老板来一杯java
  2. 加群即可赠送DDD领域驱动设计实战落地解惑PDF一份!
  3. 公众号回复java即可获取java基础经典面试一份!

好文推荐:
推荐一款基于AI编程的代码自动生成工具Cursor,替代VSCode
2.5万字讲解DDD领域驱动设计(史上最全DDD)
python vs java,从java转python一键简简单单入门,轻轻松松上手,抓紧收藏起来吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王德印

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值