HashMap在工作中使用非常频繁,其实在JDK1.8的时候新增一些更高阶的用法,熟练使用这些方法可以大大提升开发效率,写出更简洁优美的代码。

1. get方法指定返回默认值(getOrDefault)

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
String value1 = map.getOrDefault("key1", "defaultValue");
System.out.println(value1); // 输出 value1
// 当不存在key时,返回指定默认值
String value2 = map.getOrDefault("key2", "defaultValue");
System.out.println(value2); // 输出 defaultValue

2. 当key不存在时才执行put方法(putIfAbsent)

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.putIfAbsent("key1", "newValue");
String value = map.get("key1");
System.out.println(value); // 输出 value1

3. 当key存在时才执行put方法(replace)

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.replace("key1", "newValue");
map.replace("key2", "value2");
System.out.println(JSON.toJSONString(map)); //输出 {"key1":"newValue"}

4. 当value不存在时重新计算(computeIfAbsent)

有这样一个常见的应用场景,当一批用户按年龄分组之后,新用户怎么加入到分组中?

通常我们这样做的:

public class MapTest {

    static class User {
// 年龄
private Integer age;
// 姓名
private String name;
} public static void main(String[] args) {
// key是年龄,value是用户集合
Map<Integer, List<User>> map = new HashMap<>();
// 来一个新用户
User user = new User(18, "yideng");
List<User> users = map.get(user.getAge());
// 如果没有这个年龄段的用户,就需要创建一个集合
if (users == null) {
users = new ArrayList<>();
}
users.add(user);
map.put(user.getAge(), users);
} }

还是老套解决办法,一点都不优雅吧?JDK1.8后你可以这样做了

public static void main(String[] args) {
// key是年龄,value是用户集合
Map<Integer, List<User>> map = new HashMap<>();
// 来一个新用户
User user = new User(18, "Yideng");
// 如果没有这个年龄段的用户,直接创建一个集合
List<User> users = map.computeIfAbsent(user.getAge(), k -> new ArrayList<>());
users.add(user);

5. 当value存在时重新计算(computeIfPresent)

public class MapTest {

    static class User {
// 年龄
private Integer age;
// 姓名
private String name;
} public static void main(String[] args) {
// key是年龄,value是用户
Map<Integer, User> map = new HashMap<>();
map.put(18, new User(18,"Yideng"));
// 当存在key时,就重新计算value并赋值
map.computeIfPresent(18, (k, v) -> {
v.setName("一灯");
return v;
});
System.out.println(map); // 输出 {18:{"age":18,"name":"一灯"}}
} }

这个方法还有很多其他的应用场景,你认真想一下?

6. 合并新旧两个值(merge)

又有这样一个常见的应用场景,当一批用户按年龄分组之后,一批新用户怎么加入到分组中?

我们可以这样做的:

public class MapTest {

    static class User {
// 年龄
private Integer age;
// 姓名
private String name;
} public static void main(String[] args) {
// key是年龄,value是用户集合
Map<Integer, List<User>> map = new HashMap<>();
List<User> users1 = new ArrayList<>();
users1.add(new User(18, "yideng"));
map.put(18, users1); List<User> users2 = new ArrayList<>();
users2.add(new User(18, "一灯")); // 如果key存在,就合并两个集合
map.merge(18, users2, (oldV, v) -> {
oldV.addAll(v);
return oldV;
});
System.out.println(JSON.toJSONString(map)); // 输出 {18:[{"age":18,"name":"yideng"},{"age":18,"name":"一灯"}]}
} }

HashMap高阶用法,十倍提升开发效率的更多相关文章

  1. Python高阶用法总结

    目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...

  2. ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法

    NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户 ...

  3. Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型

    Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型 项目主体三个部分 ui界面,中间层,数据库 按照不同的比重可以分为一下三个模型  哑铃型  橄榄型 直板型 哑铃型 开 ...

  4. atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较

    atitit.提升开发效率---使用服务器控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此 ...

  5. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

  6. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...

  7. atitit.提升开发效率---mda 软件开发方式的革命--(2)

    atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...

  8. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

  9. atitit.提升开发效率---动态语言总结

    atitit.提升开发效率---动态语言总结 ruby,python 都不错,就是语法不好, 应用不广泛,文档,工具都非常少,不推荐... php狠不错,就是高级特性不行.. 看来子有.net/jav ...

随机推荐

  1. vue报错解决方案

    Vue build faild 解决办法: https://blog.csdn.net/u011169370/article/details/83346176 ? jbcmVideo git:(oah ...

  2. Skipper & Tcl 笔记

    https://www.cnblogs.com/yeungchie/ ski-db 打开一个文件获取 lib 对象 dbImport set file "layout.gds" s ...

  3. JdGrid排序问题

    JdGrid排序问题 js代码 function gridList() { var $gridList = $("#gridList"); $gridList.dataGrid({ ...

  4. LC-209

    给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, nums ...

  5. 共读《redis设计与实现》-数据结构篇

    准备将之前攒下的书先看一遍,主要是有个大概的了解,以后用的时候也知道在哪里找.所以准备开几篇共读的帖子,激励自己多看一些书. Redis 基于 简单动态字符串(SDS).双端链表.字典.压缩列表.整数 ...

  6. 让视障者的网络之路少一些障碍——微软为 Edge 浏览器开发自动图像描述功能并呼吁网页作者补充图片的替换说明

    网页是互联网的组成部分,浏览器是开启互联网大门的钥匙.对于生活在信息时代下的我们而言,每一个人都很难离开网络而生活,其中也包括盲人这一残障群体. 本文的引子是如下一条新闻: IT之家3月18日消息,微 ...

  7. node.js -- 身份认证

    请问昨天结束的早是对堆积在了今天吗,今天还来加个班更博,看在这个毅力的份上能否给亿点点推荐. 有个好消息有个坏消息,先说坏消息吧,就是在这么学下去我急需急支糖浆,来回顾回顾前面的知识,这几天学的太急了 ...

  8. Attention Mechanism in Computer Vision

    ​  前言 本文系统全面地介绍了Attention机制的不同类别,介绍了每个类别的原理.优缺点. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟踪.经典论文解读.CV招聘信息. 概 ...

  9. fpm工具来制作rpm包软件

    第1章 rpm包的制作 1.1 fpm的概念介绍 FPM功能简单说就是将一种类型的包转换成另一种类型 1.1.1.支持的源类型 类型 说明 dir   将目录打包成所需要的类型,可以用于源码编译安装的 ...

  10. PostgreSQL 数据库备份脚本

    PostgreSQL 数据库备份脚本 #!/bin/bash # PG家目录(/opt/postgresql/pg96/) PG_HOME=${PGHOME} # pg数据库连接信息 PG_HOST= ...