当前位置: 首页 >文章 > 你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松!
收藏
分享

你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松!

举报小虎转载君小虎转载君发布于 2021-08-18597阅读0点赞
今天栈长分享一个实用的 Java 8 开发技能,那就是 Map 接口中增加的 compute 方法,给 Map 集合计算更新用的。compute简介 如下所示,Java 8 在 Map 和...


今天栈长分享一个实用的 Java 8 开发技能,那就是 Map 接口中增加的 compute 方法,给 Map 集合计算更新用的。

compute简介

如下所示,Java 8 在 Map 和 ConcurrentMap 接口中都增加了 3 个 compute 方法,说明也是支持多线程并发安全操作的。




这三个方法的区别:

  • compute:计算并更新值
  • computeIfAbsent:Value不存在时才计算
  • computeIfPresent:Value存在时才计算

compute有啥用?

话说这有什么卵用?

先看看没用 Java 8 的一个小示例:

/**

* 公众号:Java技术栈

*/

private static void preJava8() {

    List<String> animals = Arrays.asList("dog""cat""cat""dog""fish""dog");

    Map<String, Integer> map = new HashMap<>();

    for(String animal : animals){

        Integer count = map.get(animal);

        map.put(animal, count == null ? 1 : ++count);

    }

    System.out.println(map);

}

输出:

{cat=2, fish=1, dog=3}

这是一个统计一个列表中每个动物的数量,代码再怎么精简都需要一步 get 操作,判断集合中是否有元素再确定是初始化:1,还是需要 +1。

很多时候,这个 get 操作显然是毫无必要的,所以 Java 8 提供了 3 个 compute 方法,来看看怎么用吧!

Java 8 compute 实现方式:

/**

* 公众号:Java技术栈

*/

private static void inJava8() {

    List<String> animals = Arrays.asList("dog""cat""cat""dog""fish""dog");

    Map<String, Integer> map = new HashMap<>();

    for(String animal : animals){

        map.compute(animal, (k, v) -> v == null ? 1 : ++v);

    }

    System.out.println(map);

}

使用 compute 方法一行搞定,省去了需要使用 get 取值再判断的冗余操作,直接就可以获取元素值并计算更新,是不是很方便呢?

compute源码分析

这还是一个默认方法,为什么是默认方法,也是为了不改动其所有实现类,关于默认方法的定义可以关注公众号Java技术栈获取 Java 8+ 系列教程。

/**

* 公众号:Java技术栈

*/

default V compute(K key,

        BiFunction<? super K, ? super V, ? extends V> remappingFunction) {

        

    // 函数式接口不能为空    

    Objects.requireNonNull(remappingFunction);

    

    // 获取旧值

    V oldValue = get(key);

    // 获取计算的新值



    V newValue = remappingFunction.apply(key, oldValue);

    

    if (newValue == null) { // 新值为空

        // delete mapping

        if (oldValue != null || containsKey(key)) { // 旧值存在时

            // 移除该键值

            remove(key);

            return null;

        } else {

            // nothing to do. Leave things as they were.

            return null;

        }

    } else { // 新值不为空

        // 添加或者覆盖旧值

        put(key, newValue);

        return newValue;

    }

}

实现逻辑其实也很简单,其实就是结合了 Java 8 的函数式编程让代码变得更简单了,Java 也越来越聪明了。

另外两个方法我就不演示了,在特定的场合肯定也肯定特别有用,大家知道就好,需要的时候要知道拿来用。

本节教程所有实战源码已上传到这个仓库:

https://github.com/javastacks/javastack



本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号:Java技术栈


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,673人)

电商海报设计训练营
距离开班仅剩4天78人已报名
【5月】零基础手绘插画训练营
距离开班仅剩4天75人已报名
【5月】零基础动态表情包创作训练营
距离开班仅剩21天16人已报名
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习89000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了19,254
并提交了126份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 89000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证