效率工具:Hutool 嘎嘎香,被秀到了!

在日常开发中,我们会使用很多工具类来提升项目开发的速度,而国内用的比较多的 Hutool 框架,就是其中之一。
先来看官方对于 Hutool 的定义:
Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。
Hutool 中的工具方法来自每个用户的精雕细琢,它涵盖了 Java 开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool 是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的 bug。
Hutool 官方文档:https://doc.hutool.cn/
1.包含模块
Hutool 包含以下模块:
| 模块 | 介绍 |
|---|---|
| hutool-aop | JDK 动态代理封装,提供非 IOC 下的切面支持。 |
| hutool-bloomFilter | 布隆过滤,提供一些 Hash 算法的布隆过滤。 |
| hutool-cache | 简单缓存实现。 |
| hutool-core | 核心,包括 Bean 操作、日期、各种Util等。 |
| hutool-cron | 定时任务模块,提供类 Crontab 表达式的定时任务。 |
| hutool-crypto | 加密解密模块,提供对称、非对称和摘要算法封装。 |
| hutool-db | JDBC 封装后的数据操作,基于 ActiveRecord思想。 |
| hutool-dfa | 基于 DFA 模型的多关键字查找。 |
| hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)。 |
| hutool-http | 基于 HttpUrlConnection 的 Http 客户端封装。 |
| hutool-log | 自动识别日志实现的日志门面。 |
| hutool-script | 脚本执行封装,例如 Javascript。 |
| hutool-setting | 功能更强大的 Setting 配置文件和 Properties 封装。 |
| hutool-system | 系统参数调用封装(JVM 信息等)。 |
| hutool-json | JSON 实现。 |
| hutool-captcha | 图片验证码实现。 |
| hutool-poi | 针对 POI 中 Excel 和 Word 的封装。 |
| hutool-socket | 基于 Java 的 NIO 和 AIO 的 Socket 封装。 |
| hutool-jwt | JSON Web Token(JWT)封装实现。 |
2.引入框架
首先,在项目的 pom.xml 的 dependencies 中加入以下内容:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
3.常见使用场景
3.1 HTTP 请求类
在 Java 中,Apache 的 HttpClient 用的比较多,但是由于此包较为庞大,API 又比较难用,因此并不适用很多场景,而 Hutool 的 Hutool-http 针对 JDK 的 HttpUrlConnection 做一层封装,简化了 HTTPS 请求、文件上传、Cookie 记忆等操作,使 Http 请求变得无比简单。
具体使用,例如发送一个 GET 请求:
// GET请求
String content = HttpUtil.get(url);
发送一个 POST 请求:
// POST 请求
HashMap<String, Object> param = new HashMap<>();
paramMap.put("city", "西安");
String result1 = HttpUtil.post("www.javacn.site", param);
3.2 生成 N 位随机验证码
例如,生成手机验证码(4 位或 6 位),使用 Hutool 的这个功能就再也合适不过了,具体实现代码如下:
// 生成 4 位随机验证码
String verificationCode = RandomUtil.randomStringUpper(4);
3.3 拼音工具
Hutool 封装了拼音的门面,用于兼容以下拼音库:
- TinyPinyin
- JPinyin
- Pinyin4j
和其它门面模块类似,采用 SPI 方式识别所用的库。例如你想用 Pinyin4j,只需引入 jar,Hutool 即可自动识别。
以下为 Hutool 支持的拼音库的 pom 坐标,你可以选择任意一个引入项目中,如果引入多个,Hutool 会按照以上顺序选择第一个使用。
TinyPinyin 依赖:
<dependency>
<groupId>io.github.biezhi</groupId>
<artifactId>TinyPinyin</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
JPinyin 依赖:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
Pinyin4j 依赖:
<dependency>
<groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId>
<version>1.1.8</version>
</dependency>
① 获取全部拼音
// 输出结果:ni hao
String pinyin = PinyinUtil.getPinyin("你好", " ");
这里定义的分隔符为空格,你也可以按照需求自定义分隔符,亦或者使用 "" 代表无分隔符。
② 获取拼音首字母
// 输出结果:h, s, d, y, g
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");
③ 自定义拼音库(拼音引擎)
Pinyin4jEngine engine = new Pinyin4jEngine();
// 输出结果:ni hao h
String pinyin = engine.getPinyin("你好h", " ");
3.4 计时器
Hutool 通过封装 TimeInterval 实现计时器功能,即可以计算方法或过程执行的时间。
具体使用如下:
TimeInterval timer = DateUtil.timer();
// todo:执行具体业务
timer.interval(); // 花费毫秒数
timer.intervalRestart();// 返回花费时间,并重置开始时间
timer.intervalMinute(); // 花费分钟数
也可以实现分组计时:
final TimeInterval timer = new TimeInterval();
// 分组 1
timer.start("1");
ThreadUtil.sleep(1000);
// 分组 2
timer.start("2");
ThreadUtil.sleep(2000);
// 打印时间
Console.log("Timer 1 took {} ms", timer.intervalMs("1"));
Console.log("Timer 2 took {} ms", timer.intervalMs("2"));
3.5 数字工具
NumberUtil 数字工具针对数学运算做工具性封装。
我最喜欢使用它的保留小时和数字格式化,下面一起来看吧。
① 保留小数
保留小数的方法主要有两种:
- NumberUtil.round 方法主要封装 BigDecimal 中的方法来保留小数,返回 BigDecimal,这个方法更加灵活,可以选择四舍五入或者全部舍弃等模式。
- NumberUtil.roundStr 方法主要封装 String.format 方法,舍弃方式采用四舍五入。
具体实现如下。
NumberUtil.round 方法使用:
double te1=123456.123456;
double te2=123456.128456;
Console.log(round(te1,4)); // 结果:123456.1235
Console.log(round(te2,4)); // 结果:123456.1285
NumberUtil.roundStr 方法使用:
double te1=123456.123456;
double te2=123456.128456;
Console.log(roundStr(te1,2));//结果:123456.12
Console.log(roundStr(te2,2));//结果:123456.13
② 时间格式化
针对 DecimalFormat.format 进行简单封装。按照固定格式对 double 或 long 类型的数字做格式化操作,具体实现如下:
long c = 299792458; // 光速
String format = NumberUtil.decimalFormat(",###", c); // 299,792,458
格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
- 0 -> 取一位整数。
- 0.00 -> 取一位整数和两位小数。
- 00.000 -> 取两位整数和三位小数。
- # -> 取所有整数部分。
.##% -> 以百分比方式计数,并取两位小数。
.#####E0 -> 显示为科学计数法,并取五位小数。
- ,### -> 每三位以逗号进行分隔,例如:299,792,458。
- 光速大小为每秒,###米 -> 将格式嵌入文本。
③ 校验数字
- NumberUtil.isNumber:是否为数字。
- NumberUtil.isInteger:是否为整数。
- NumberUtil.isDouble:是否为浮点数。
- NumberUtil.isPrimes:是否为质数。
④ 随机数
- NumberUtil.generateRandomNumber 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
- NumberUtil.generateBySet 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
3.6 数据脱敏
在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此Hutool针对常用的信息封装了一些脱敏方法。
现阶段支持的脱敏数据类型包括:
- 用户 id
- 中文姓名
- 身份证号
- 座机号
- 手机号
- 地址
- 电子邮件
- 密码
- 中国大陆车牌,包含普通车辆、新能源车辆
- 银行卡
整体来说,所谓脱敏就是隐藏掉信息中的一部分关键信息,用*代替,自定义隐藏可以使用 StrUtil.hide 方法完成。
我们以身份证号码为例:
// 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);
对于约定俗成的脱敏,我们可以不用指定隐藏位数,比如手机号:
// 180****1999
DesensitizedUtil.mobilePhone("18049531999");
当然还有一些简单粗暴的脱敏,比如密码,只保留了位数信息:
// **********
DesensitizedUtil.password("1234567890");
3.7 邮件发送工具
在 Java 中发送邮件主要依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装 MailUtil,它的使用主要需要两步:
- 添加 Java Mail 依赖(因为 MailUtil 是对它的封装)。
- 编写邮件发送代码。
① 添加依赖
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
② 编写发送代码
// 发送普通文本邮件,最后一个参数可选是否添加多个附件
MailUtil.send("hutool@foxmail.com", "测试", "邮件来自磊哥测试", false);
// 发送 HTML 格式的邮件并附带附件,最后一个参数可选是否添加多个附件:
MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自磊哥测试</h1>", true, FileUtil.file("d:/aaa.xml"));
// 群发邮件,可选 HTML 或普通文本,可选多个附件:
ArrayList<String> tos = CollUtil.newArrayList(
"person1@bbb.com",
"person2@bbb.com",
"person3@bbb.com",
"person4@bbb.com");
MailUtil.send(tos, "测试", "邮件来自磊哥群发测试", false);
3.8 布隆过滤器
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检元素一定不在;如果都是 1,则被检元素很可能在。这就是布隆过滤器的基本思想。参考:https://www.cnblogs.com/z941030/p/9218356.html
布隆过滤器的具体使用如下:
// 初始化
BitMapBloomFilter filter = new BitMapBloomFilter(10);
filter.add("123");
filter.add("abc");
filter.add("ddd");
// 查找
filter.contains("abc")
小结
不是代码写不起,而是 Hutool 更有性价比。正如官方描述的那样,使用 Hutool 会有种甜甜的感觉,磨刀不误砍柴工,Hutool 用上之后代码嘎嘎香,快去试试吧~
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。
效率工具:Hutool 嘎嘎香,被秀到了!的更多相关文章
- 那些年尝试过的效率工具之Total Commander
昨天电脑文件很乱,想整理一下发现移动.复制文件要来回目录切换很麻烦,突然就又想起了用Total Commander——简称TC,很久之前尝试过但没坚持使用的工具. 借此机会总结一下自己对TC的认识,后 ...
- 向 Windows 高级用户进阶,这 10 款效率工具帮你开路 | 新手问号
原文地址:https://sspai.com/post/41411 编注:「新手问号」是少数派的一个全新栏目.它面向完全「零基础」的新手用户,通过最简单易懂的方式,帮助你快速掌握关于系统和软硬件的入门 ...
- Java效率工具Lombok使用与原理
Java效率工具Lombok使用与原理 我个人觉得 Lombok是一个优化Java代码以及提升开发效率不错的工具.Lombok 的Github地址为:https://github.com/rzwits ...
- Java 效率工具, 大幅度提高开发效率
你是否有遇到过这样的情况,在开发过程中需要比较两列数据,但使用文本比对工具的话他是按行基准比对的,我还得对每列数据先进行排序,但排序又去哪里排, 想到 excel 可以排序 , 折腾下来,特别麻烦, ...
- 干掉复杂的工具类,国产Java工具类库 Hutool 很香!
Hutool 大家已经比较熟悉了,这是一个超全的 Java 工具库,深受国内开发者的喜爱. 我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好.而 ...
- 效率工具 | 快速创建虚拟机,Vagrant真香!
Vagrant 是一个基于Ruby的工具,主要用于创建和部署虚拟化开发环境.它以来于Oracle的开源VirtualBox虚拟化系统,通过使用 Chef创建自动化虚拟环境. Vagrant 主要的功能 ...
- 我珍藏的神兵利器 - 效率工具for Win[转]
工欲善其事必先利其器. 我一直都在不断挑选和优化自己的兵器,以追求着最高效率. 此篇分享下我的私家珍藏的各种神兵利器.如果有朋友能推荐更好的,那就不枉此篇. 分为Windows软件和开发工具两 ...
- 解放你生产力的10款效率工具,赶紧mark起来
聪明的人总是善用工具 社会的快度发展赋予我们的一个幸运之处在于:你可以通过读书或使用工具去改善自身的处境甚至是阶层. 在父母那个时代,通过熟练使用办公软件,可以使一个在水泥地做帮工的青年走进格子间.而 ...
- Mac 效率工具必备神器 —— Alfred
前言 alfred 这款软件称为「神器」真是当之无愧.今天专门总结一下,作为之前 Mac 配置教程-开发篇 的补充. 需要说明的是,如果你发现我介绍的功能无法使用,则代表需要花钱购买它的 Powerp ...
- iOS 伐码猿真爱—「偷懒 || 效率 工具类」
自检 代码不会可以多敲几次,学习的重点是思想:-- 认同. BUT 如果你把自己会的.熟知的.可以说写的似流水的代码,不管是在工作 或是 自学习中你还是一点一点的敲出来,是不是有点...,copy & ...
随机推荐
- 大规模 IoT 边缘容器集群管理的几种架构-6-个人体验及推荐
前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s 大规模 IoT 边缘容器集群管理的几种架构-2-H ...
- 【项目源码】基于JSP动漫论坛的设计与实现
动漫论坛项目主要用于实现动漫爱好者的互相交流,基本功能包括:注册用户.登录.浏览帖子.发布新帖.回复帖子.等.本系统结构如下: (1)普通用户: 注册用户:如果用户为非会员用户,通过注册,经审核通过之 ...
- BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)
软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...
- 通过 Haproxy 实现 ss 负载均衡
介绍 缺点:所有的SS的加密方式和密码必须一致 介绍:HAProxy是一个使用C语言编写的自由及开放原始码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 安装Haproxy ...
- WebStrom提交代码到GitLab报错Error: Cannot find any-observable implementation nor global.Observable.
项目场景: 前端代码完成后,提交代码 问题描述 提交代码到GitLab时,因自动检测机制导致项目提交失败 C:\D\insper\inspur_works\custom-manage-front\no ...
- 解决软件安装无法自定义文件夹,自动安装在C盘 (Windows系统)
其实就是软链接的简单应用 1.软件已经自动安装 2.完全退出当前软件 3.通过软件图标的属性找到其实际的安装目录 4.进入该软件的安装目录 5.将该软件整个剪切(你没有看错)到指定文件夹(自定义的安装 ...
- SpringSecurity-前后端分离教程
1.简介 Spring Security 是 Spring 家族中的一个安全管理框架.相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富. 一般来说中大型的项目都是使用 ...
- About Info-ZIP
LATEST RELEASES: Zip 3.00 was released on 7 July 2008. WiZ 5.03 was released on 11 March 2005. UnZip ...
- LVGL双向链表学习笔记
LVGL双向链表学习笔记 1.LVGL链表数据类型分析 对于LVGL双向链表的使用,我们需要关注lv_ll.h和lv_ll.c两个文件,其中lv_ll.h里面包含了链表结构类型定义,以及相关API的声 ...
- buffer busy waits等待事件案例-vage
转自vage 讨厌香草冰激凌的汽车与Buffer busy wiats的故事 记得好几年前看到过一个故事,通用公司曾收到一客户的邮件,邮件中客户描述了一个非常奇怪的问题.他们家有晚饭后去 ...