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. 一篇文章带你整明白HTTP缓存知识

    最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...

  2. Redis分布式实现原理

    一.使用 1.pom.xml导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <ar ...

  3. VUE3 之 全局 Mixin 与 自定义属性合并策略 - 这个系列的教程通俗易懂,适合新手

    1. 概述 老话说的好:心态决定命运,好心态才能有好的命运. 言归正传,今天我们来聊聊 VUE 中的全局 Mixin 与 自定义属性合并策略. 2. Mixin 的使用 2.1 全局 Mixin 之前 ...

  4. Vue3 + Echarts 5 绘制带有立体感流线中国地图,建议收藏

    本文绘制的地图效果图如下: 一.Echarts 使用五部曲 1.下载并引入 echarts Echarts 已更新到了 5.0 版本,安装完记得检查下自己的版本是否是 5.0 . npm instal ...

  5. MySQL发展历史

    MySQL(发音为"my ess cue el")是一种关系型数据库管理系统, MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Su ...

  6. Zalando Postgres Operator 快速上手

    本指南旨在让您快速了解在本地 Kubernetes 环境中使用 Postgres Operator. 前提条件 由于 Postgres Operator 是为 Kubernetes (K8s) 框架设 ...

  7. JQuery学习高级

    ## 今日内容:     1. JQuery 高级         1. 动画         2. 遍历         3. 事件绑定         4. 案例         5. 插件 ## ...

  8. 2021.07.23 P3275 糖果(差分约束)

    2021.07.23 P3275 糖果(差分约束) [P3275 SCOI2011]糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.为了满足更多更多约束条件,合适地 ...

  9. AndroidStudio中的模块依赖引入后用不了

    ------------恢复内容开始------------ 在Android开发中,com.android.tools.build:gradle 3.0 以下版本依赖在gradle 中的声明写法: ...

  10. mmdetection 批量执行测试脚本

    在终端执行该脚本,传入所有的测试路径,每一个model的结果文件夹里面有一个best文件夹存放着其训练时最高mAP对应的权重,名字为best.pth dir=$(ls -l $1 |awk '/^d/ ...