Java8新特性-Map API用法(六)

本文总结了Java8中Map API的新增特性,并通过一个完整的Demo展示其使用方法,帮助开发者更好地理解和应用这些新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java8增加了Map的API,方便我们的操作,使用的场景还是比较多的,在这里做下总结。

API介绍

方法名称用途说明
forEach遍历Map新的遍历Map的形式,以前用entrySet的时候泛型写的很复杂,新的api简单易懂。
compute根据原来的值,更新值如果返回的值为null,会从集合中删除掉该键值对,而不是把值更新为null
computeIfAbsentabsent译为缺乏的。方法目的在于声明不包含该键或者键对应的值为null时的处理逻辑,即添加默认值。不包含和值为null都会出发函数处理
computeIfPresentPresent译为存在的。方法目的在于声明键对应的值不为null时的处理逻辑,即根据原来的值更新值定义函数的时候不需要对value进行判断空处理。新值为null的时候删除键值对
getOrDefault当集合中不存在指定Key时,定义默认值获取到的默认值不会存入集合替换旧值。判断条件是key是否存在,不会去判断key对应的值是不是null
merge根据map中指定key的原始值,计算出新值第一个参数:键;第二个参数:当key不存在或者value是null时候为key添加的默认值;函数的第一个是原始值,第二个是默认值,返回map的value。
putIfAbsent如果key对应的值是null,放入默认值方法返回的是当前key对应的值
replace替换和put覆盖的区别在于如果不存在key的时候返回null,且不会去放入新值。put不管之前key对应的值存不存在都会放入新键值。

完整Demo

public class MapTest {

    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("a",1);
        map.put("b",3);

        System.out.println("-----forEach写法----");
        map.forEach((key, value)->System.out.println(key+ " ---> "+ value));


        System.out.println("-----compute----");
        doCompute(map, "a");
        System.out.println(map.get("a"));
        // console:3  原值为1,计算出新的值为3

        doCompute(map, "c");
        System.out.println(map.get("c"));
        // console:1 原来不存在的key,现在新建键值对,key:c value:1

        doCompute(map, "b");
        System.out.println(map.containsKey("b"));
        // console:false 当原来有值,但是现在返回null的时候删除该键值对


        //ComputeIfAbsent用法 不包含该键或者key对应的值为null,则会根据方法添加新的键值对
        map.clear();
        System.out.println("-----doComputeIfAbsent----");
        System.out.println(doComputeIfAbsent(map, "a"));
        // console: 1 ;如果传入的键对应的值为空的时候,执行后面的函数,为该键初始化一个值放入集合
        map.put("a",3);
        System.out.println(doComputeIfAbsent(map, "a"));
        // console: 3 ; 如果传入的键对应的值不为空的时候,返回


        map.clear();
        System.out.println("-----doComputeIfPresent----");
        System.out.println(doComputeIfPresent(map, "a"));
        //console: null; value不存时不会执行函数,好处是不用在函数中处理空值
        map.put("a",3);
        System.out.println(doComputeIfPresent(map, "a"));
        //console: 4 ; 如果value值不为空执行函数
        map.put("b",1);
        doComputeIfPresent(map, "b");
        System.out.println(map.containsKey("b"));
        //console: false; 如果返回的值是null 会从集合中删除key


        map.clear();
        System.out.println("-----doGetOrDefault----");
        System.out.println(map.getOrDefault("a",3));
        //console: 3; 因为不存在key 返回3
        System.out.println(map.get("a"));
        //console: null;  所以这个方法不会把默认值回填到集合中,不会创建新的键值对
        map.put("a",null);
        System.out.println(map.getOrDefault("a",3));
        //console: null;  不会去校验键对应的value值,只看存不存在key


        map.clear();
        System.out.println("-----domerge----");
        map.put("a",2);
        /**
         * 第一个参数: 指定键
         * 第二个参数: 默认值,当key对应的value为null返回值,该值会存入集合
         * 第三个参数: lambda表达式,输入为集合中的原始值以及之前定义的默认值, 返回是map中的value
         */
        Integer res = map.merge("a", 1, (oriValue, value)->{
            System.out.println("原值:"+ oriValue);
            System.out.println("默认值:" + value);
            return oriValue+4;
        });

        System.out.println(res);
        //console: 6;  原始值为2 加了4 返回6;
        System.out.println(map.get("a"));
        //console: 6;  集合中对应的key的值已经更新

        System.out.println("----验证默认值-----");
        Integer res2 = map.merge("c", 1, (oriValue, value)->{
            System.out.println("原值:"+ oriValue);
            System.out.println("默认值:" + value);
            return oriValue+4;
        });
        System.out.println(res2);
        //console: 1; 不存在key或者key的value是null的时候 返回默认值
        System.out.println(map.get("c"));
        //console: 1; 不存在key或者key的value是null的时候 返回默认值已存入集合


        map.clear();
        System.out.println("----putIfAbsent----");
        //如果key对应的值是null,放入默认值
        System.out.println(map.putIfAbsent("a",1));
        //console: null; 这里返回的是原来map中key对应的值
        System.out.println(map.get("a"));
        //console: 1;  已经将默认值放入集合
        map.put("a",3);
        System.out.println(map.putIfAbsent("a",1));
        //console: 3; 返回的是当前的键对应的值


        map.clear();
        System.out.println("----replace----");
        //和put覆盖的区别在于如果不存在key的时候返回null,且不会去放入新值。put不管之前key对应的值存不存在都会放入新键值。
        System.out.println(map.replace("a",1));
        //console:null; key不存在时不处理;
        map.put("a",null);
        map.replace("a",1);
        System.out.println(map.containsKey("a"));
        //console: true; 当key存在是替换,不会去判断value是不是null;


        map.clear();
        map.put("a",3);
        System.out.println(map.replace("a",1));
        //console:3 ; replace返回的是替换前的值
        System.out.println(map.get("a"));
        //console: 1; 集合中的值已经替换成指定值了

    }


    /**
     * compute 用来根据原来的值计算新的值,计算出来的值不需要重新put进去,当做function的结果返回即可
     * 如果传入的key为空要处理,不然会报空指针
     * 如果输入key对应的值为null,创建键值对key, 1
     * 如果输入的key的值是3返回null; 注意:原键值不为null,返回值为null,是不会改变原来值的。
     * 否则给值加2重新返回集合中
     * @param map
     */
    public static void doCompute(Map<String,Integer> map, String key){
        map.compute(key, (k,v)->{
            if(null == v){
                return 1;
            }
            else if(v == 3){
                return null;
            }
            else{
                return v+2;
            }
        });
    }

    public static Integer doComputeIfAbsent(Map<String,Integer> map, String key){
       return  map.computeIfAbsent(key, k->1);
    }

    //如果获取到的key对应的值不为null, 则根据原来的key和value计算出新的值,覆盖原来的值,新值为null的时候删除键值对
    public static Integer doComputeIfPresent(Map<String,Integer> map, String key){
        return map.computeIfPresent(key,(k,value)->{
            if("b".equals(k)){
                return null;
            }
            else{
                return value+1;
            }
        });
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值