小试牛刀:jdk8的Map新方法之computeIfAbsent、computeIfPresent和putIfAbsent

最近一个多月在分析SpringBoot源码(面试官:你说说Springboot的启动过程吧(5万字分析启动过程))大概写了5万字,感兴趣的可以看一下哦~

在源码分析的博客中搜索3)为生命周期处理器进行广播更新,这个小节中,有一个关于Map的操作方法:computeIfAbsent,这个方法我以前的确是没有用过,看了一些别的大神写的demo和自己的理解,也写了一下:

package com.fanhf.demo;


import org.testng.annotations.Test;

import java.util.*;

public class SpringBootExercize {
    @Test
    public void testComputeIfAbsent(){
        HashMap<String, PersonGroup> personGroupHashMap = new HashMap<>();
        PersonGroup person1 = new PersonGroup();
        person1.add("张三");
        personGroupHashMap.put("Doctor", person1);
        System.out.println("--------------原Map集合元素-----------------");

        personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));

        System.out.println("--------------Map中添加元素--常规做法-----------------");
        // Map集合中包含Teacher的分组,则往Teacher的分组添加王五
        if (personGroupHashMap.containsKey("Teacher")) {
            personGroupHashMap.get("Teacher").add("王五");
        } else {
            // Map集合中不包含Teacher的分组,则往Teacher的分组添加赵六
            PersonGroup person3 = new PersonGroup();
            person3.add("赵六");
            personGroupHashMap.put("Teacher", person3);
        }
        personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));

        System.out.println("-----------Map中添加元素--1.8升级做法-----putIfAbsent---------------");
        // key存在则不覆盖
        personGroupHashMap.putIfAbsent("Teacher", new PersonGroup());
        PersonGroup personGroup = new PersonGroup();
        personGroup.add("Lily");
        //key不存在才放到map中
        personGroupHashMap.putIfAbsent("Developer", personGroup);
        personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
        
        System.out.println("-----------Map中添加元素--1.8升级做法----computeIfAbsent------------");
        //Map集合中不包含Doctor的分组,则往Doctor的分组添加周七
        personGroupHashMap.computeIfAbsent("Doctor", pg -> new PersonGroup()).add("周七");
        //Map集合中包含Teacher的分组,则往Teacher的分组添加王五
        personGroupHashMap.computeIfAbsent("Teacher", pg -> new PersonGroup()).add("王五");
        personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));


        System.out.println("-----------Map中添加元素--1.8升级做法--computeIfPresent-------------");
        //存在Teacher,则替换掉原来的,所以我感觉这个的使用场景比较少,还是computeIfAbsent的使用场景多些。
        personGroupHashMap.computeIfPresent("Teacher", (k, pg) -> new PersonGroup()).add("只对存在的key对应的value进行替换操作,不存在的key的有NPE的风险");

        personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
    }


    /**
     * 把人进行分组
     */
    private class PersonGroup {
        private  List<String> members = new ArrayList<>();

        public void add(String name) {
            this.members.add(name);
        }
    }
}


控制台打印:
在这里插入图片描述

-------------你知道的越多,不知道的越多--------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值