⚡效率工具(第二期)⚡ - Hutool,一个让你用起来甜甜的工具包

1,340 阅读5分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

前言

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”

在平时开发中,我们一定少不了维护util 包的时候,这里面存放的多数是一些复用性强的工具代码;而Hutool的出现,是项目中util包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug

作为一个20k+ star 的工具库项目,Hutool代码的身影无处不在,在GitHub上被超过38k+的项目所依赖,相信各大企业的项目中也少不了Hutool的身影

符上链接:Hutool — 🍬A set of tools that keep Java sweet.

小彩蛋

写这一期的原因,来自我的同事,当时我们有一个需求是:在进入算法前,对身份证的格式进行校验,校验不通过的个人信息要进一步做处理

这位仁兄手写了一个身份证校验工具,在进行各种测试的时候被我看到了

我:“你为什么不用Hutool里面的校验工具,像身份证手机号这些校验工具别人都写好了,经过各种项目验证过了?”

对方:“Hutool???(皱眉、疑惑、一丝丝震惊、一丝丝我是不是白干了的担心)???”

我:当面撸了一个例子

对方:“(国骂)!白干了一天!”


1. 依赖引入

在写本文时,官网的最新版为5.7.8

对于Hutool工具包,我们可以全量引入:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.8</version>
</dependency>

也可以根据Hutool的模块来按需引入:


2. 用例

讲一下在工作中我用到Hutool 的一些场景,进一步讲解一下Hutool工具包的应用范围

2.1 场景一:Http请求工具类

项目中有个小需求,目的是在一次业务操作的方法完成后,通过调用HTTP接口的方式去通知一下第三方的业务系统

于是我使用自定义注解和AOP实现了一个异步通知的方法,再利用Hutool的Http模块实现了接口的调用:

String postResult;
try {
    postResult = HttpUtil.post(url, body);
} catch (Exception e) {
    log.info(推送失败,原因);
    return;
}

其实,从Hutool源码封装的API来看,只要稍微懂一点原理,就能无缝上手,稍微有点疑惑只要翻看一下源码就能马上明白该怎么用:


2.2 场景二:equal判断

我们写代码的时候经常遇到要判断两个对象是否相等的情况,而对象自带的equal() 方法是有可能抛出令我们最讨厌的NullPointerException的,就像下面这种情况:

Student a = null;
Student b = new Student();
a.equals(b);

此时你要是有安装SonarLint的话,会有这么一个提醒:

此时,我们可以用Hutool的ObjectUtil 工具里封装的equal() 方法来替代:

但这里需要注意的是,两个对象为null的时候返回的结果也是True,在使用封装的工具类时,要特别注意的是返回值的形式,不能用习惯来判断它是怎样返回的,否则很可能导致程序运行的结果和你的预期有出入


2.3场景三:布隆过滤器实现

Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。

  • 如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。
  • 因此Bloom filter具有100%的召回率。这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况。

说到布隆过滤器,有很多的实现可以用,比如guava的布隆过滤器实现,Redis也有布隆过滤器功能的版本,但是Hutool胜在API的简单易用啊,可以看作是一个简易的实现,能满足我们的需求即可

// 初始化
BitMapBloomFilter filter = new BitMapBloomFilter(10);
filter.add("123");
filter.add("abc");
filter.add("ddd");

// 查找
System.out.println(filter.contains("abc"));

//输出
true

2.4 场景四:常用的格式校验

当接口涉及到个人信息时,我们常常要对个人信息的手机号、身份证等信息进行一个格式验证,寻常的办法肯定是找一个正则表达式,再转换成Java代码写到代码逻辑中

但其实Hutool早就封装好了,我们只需要一个简单的调用:

boolean result = Validator.isCitizenId("123");
System.out.println(result);

//输出
false

可以看到是非常的齐全了

总结

其实Hutool工具包的上手真的和容易,只需要看一下官方文档和示例,哪怕你是第一次用也能很好的使用Hutool完成一些比较复杂的功能

但是使用的时候也要注意以下几点

  • 使用工具类的时候一定要注意返回值,不要让“经验注意”导致程序出现与预期不符的结果
  • 工具类经过众多项目、开源贡献者的验证,可以信任,但是必要的测试不可少
  • 可以用但不代表可以滥用,当使用某一个技术进行实现时,最好与同类技术进行比较,避免出现问题的同时可以扩充自己的知识库
  • 据我所知是有公司明令禁止使用这个工具库,可能就是一些粗心的程序yuan踩了以上的三点[狗头]