在日常开发中,我们会使用很多工具类来提升项目开发的速度,而国内用的比较多的 Hutool 框架,就是其中之一。
先来看官方对于 Hutool 的定义:
Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。
Hutool 中的工具方法来自每个用户的精雕细琢,它涵盖了 Java 开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool 是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的 bug。
Hutool 官方文档:doc.hutool.cn/
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)封装实现。 |
首先,在项目的 pom.xml 的 dependencies 中加入以下内容:
1 2 3 4 5 |
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency> |
在 Java 中,Apache 的 HttpClient 用的比较多,但是由于此包较为庞大,API 又比较难用,因此并不适用很多场景,而 Hutool 的 Hutool-http 针对 JDK 的 HttpUrlConnection 做一层封装,简化了 HTTPS 请求、文件上传、Cookie 记忆等操作,使 Http 请求变得无比简单。
具体使用,例如发送一个 GET 请求:
1 2 |
// GET请求 String content = HttpUtil.get(url); |
发送一个 POST 请求:
1 2 3 4 |
// POST 请求 HashMap<String, Object> param = new HashMap<>(); paramMap.put("city", "西安"); String result1 = HttpUtil.post("www.javacn.site", param); |
例如,生成手机验证码(4 位或 6 位),使用 Hutool 的这个功能就再也合适不过了,具体实现代码如下:
1 2 |
// 生成 4 位随机验证码 String verificationCode = RandomUtil.randomStringUpper(4); |
Hutool 封装了拼音的门面,用于兼容以下拼音库:
和其它门面模块类似,采用 SPI 方式识别所用的库。例如你想用 Pinyin4j,只需引入 jar,Hutool 即可自动识别。
以下为 Hutool 支持的拼音库的 pom 坐标,你可以选择任意一个引入项目中,如果引入多个,Hutool 会按照以上顺序选择第一个使用。
TinyPinyin 依赖:
1 2 3 4 5 |
<dependency> <groupId>io.github.biezhi</groupId> <artifactId>TinyPinyin</artifactId> <version>2.0.3.RELEASE</version> </dependency> |
JPinyin 依赖:
1 2 3 4 5 |
<dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency> |
Pinyin4j 依赖:
1 2 3 4 5 |
<dependency> <groupId>com.github.stuxuhai</groupId> <artifactId>jpinyin</artifactId> <version>1.1.8</version> </dependency> |
1 2 |
// 输出结果:ni hao String pinyin = PinyinUtil.getPinyin("你好", " "); |
这里定义的分隔符为空格,你也可以按照需求自定义分隔符,亦或者使用 "" 代表无分隔符。
1 2 |
// 输出结果:h, s, d, y, g String result = PinyinUtil.getFirstLetter("H是第一个", ", "); |
1 2 3 |
Pinyin4jEngine engine = new Pinyin4jEngine(); // 输出结果:ni hao h String pinyin = engine.getPinyin("你好h", " "); |
Hutool 通过封装 TimeInterval 实现计时器功能,即可以计算方法或过程执行的时间。
具体使用如下:
1 2 3 4 5 |
TimeInterval timer = DateUtil.timer(); // todo:执行具体业务 timer.interval(); // 花费毫秒数 timer.intervalRestart();// 返回花费时间,并重置开始时间 timer.intervalMinute(); // 花费分钟数 |
也可以实现分组计时:
1 2 3 4 5 6 7 8 9 10 |
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")); |
NumberUtil 数字工具针对数学运算做工具性封装。
我最喜欢使用它的保留小时和数字格式化,下面一起来看吧。
保留小数的方法主要有两种:
具体实现如下。
NumberUtil.round 方法使用:
1 2 3 4 |
double te1=123456.123456; double te2=123456.128456; Console.log(round(te1,4)); // 结果:123456.1235 Console.log(round(te2,4)); // 结果:123456.1285 |
NumberUtil.roundStr 方法使用:
1 2 3 4 |
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 类型的数字做格式化操作,具体实现如下:
1 2 |
long c = 299792458; // 光速 String format = NumberUtil.decimalFormat(",###", c); // 299,792,458 |
格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此Hutool针对常用的信息封装了一些脱敏方法。
现阶段支持的脱敏数据类型包括:
整体来说,所谓脱敏就是隐藏掉信息中的一部分关键信息,用*代替,自定义隐藏可以使用 StrUtil.hide 方法完成。
我们以身份证号码为例:
1 2 |
// 5***************1X DesensitizedUtil.idCardNum("51343620000320711X", 1, 2); |
对于约定俗成的脱敏,我们可以不用指定隐藏位数,比如手机号:
1 2 |
// 180****1999 DesensitizedUtil.mobilePhone("18049531999"); |
当然还有一些简单粗暴的脱敏,比如密码,只保留了位数信息:
1 2 |
// ********** DesensitizedUtil.password("1234567890"); |
在 Java 中发送邮件主要依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装 MailUtil,它的使用主要需要两步:
1 2 3 4 5 |
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 发送普通文本邮件,最后一个参数可选是否添加多个附件 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); |
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检元素一定不在;如果都是 1,则被检元素很可能在。这就是布隆过滤器的基本思想。参考:www.cnblogs.com/z941030/p/9…
布隆过滤器的具体使用如下:
1 2 3 4 5 6 7 8 |
// 初始化 BitMapBloomFilter filter = new BitMapBloomFilter(10); filter.add("123"); filter.add("abc"); filter.add("ddd"); // 查找 filter.contains("abc") |
不是代码写不起,而是 Hutool 更有性价比。正如官方描述的那样,使用 Hutool 会有种甜甜的感觉,磨刀不误砍柴工,Hutool 用上之后代码嘎嘎香,快去试试吧~