HashMap高阶用法,十倍提升开发效率
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高阶用法,十倍提升开发效率的更多相关文章
- Python高阶用法总结
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...
- ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户 ...
- Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型 橄榄型 直板型
Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型 橄榄型 直板型 项目主体三个部分 ui界面,中间层,数据库 按照不同的比重可以分为一下三个模型 哑铃型 橄榄型 直板型 哑铃型 开 ...
- atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较
atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此 ...
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...
- atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表
atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...
- atitit.提升开发效率---mda 软件开发方式的革命--(2)
atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...
- atitit.提升开发效率---mda 软件开发方式的革命
atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...
- atitit.提升开发效率---动态语言总结
atitit.提升开发效率---动态语言总结 ruby,python 都不错,就是语法不好, 应用不广泛,文档,工具都非常少,不推荐... php狠不错,就是高级特性不行.. 看来子有.net/jav ...
随机推荐
- 基于express框架的留言板实现步骤
这个留言板是基于express框架,和ejs模板引擎,首先需要在根目录安装express框架,然后安装ejs模块和body-parser(获取用户表单提交的数据):建立项目目录 message,然后依 ...
- VirtualBox使用报错
VirtualBox使用报错 1.启动报错:Failed to instantiate CLSID_VirtualBox... 报错内容: Failed to instantiate CLSID_Vi ...
- 内网穿透NPS
内网穿透实现 nps文档 https://ehang-io.github.io/nps/#/install nps docker镜像 https://hub.docker.com/r/ffdfgdfg ...
- Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
Problem - C - Codeforces 看清题目要求, 最重要部分在第二段. 大佬最后给出的代码果然简单, 思路简单化, 未必非要把答案在一个大括号里全部完成, 两个指针同时跑,中间加了一堆 ...
- 搜索与图论②--宽度优先搜索(BFS)
宽度优先搜索 例题一(献给阿尔吉侬的花束) 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔 ...
- Vue2响应式原理
vue2响应式原理 vue的特性:数据驱动视图和双向数据绑定.vue官方文档也提供了响应式原理的解释: 深入响应式原理 Object.defineProperty() Object.definePro ...
- Spring从入门到源码(一)
Spring 1.什么是框架? 人话就是:方便干活,架子有了,直接拿来用就完事了. spring,springmvc,mybatis三大开框架 2.架构的演变过程 单一应用架构 垂直应用架构 分布式服 ...
- 攻防世界-MISC:pure_color
这是攻防世界高手进阶区的第六题,题目如下: 点击下载附件一,得到一张空白的png图片 用StegSolve打开,然后点击箭头(如下图所示) 多点击几次,即可得到flag 所以,这道题的flag如下: ...
- 开发并发布npm包,支持TypeScript提示,rollup构建打包
前言: 工作了几年,想把一些不好找现成的库的常用方法整理一下,发布成npm包,方便使用.也学习一下开发发布流程. 主要用到的工具:npm. 开发库:babel.typescript.rollup.es ...
- 基于.Net C# 通信开发-串口调试助手
基于.Net C# 通信开发-串口调试助手 1.概述 串口调试助手,广泛应用于工控领域的数据监控.数据采集.数据分析等工作,可以帮助串口应用设计.开发.测试人员检查所开发的串口应用软硬件的数据收发状况 ...