目录
●Hutool是什么?
接下来的两篇文章,笔者将给大家安利一个能够明显提升Java开发效率的开源项目Hutool。官方对其描述为:A set of tools to keep java sweet。它其实是一套Java工具包,提供了许多与业务无关的常用方法,避免重复开发。截止笔者撰文,它在Github上已经收获了2033个Star,要知道,大名鼎鼎的Tomcat也不过2628,可见,它是受广大程序员推崇的。
笔者之所以要推荐这个开源项目给大家,最主要是因为其三大优势——
优势1:遵循Apache2.0开源许可协议,商业友好,可以无风险地接入使用;
优势2:提供的工具众多且实用,拥有完善的API手册,方便查找;
优势3:按需配置依赖,伸缩轻量灵活;
Hutool项目Github传送门:https://github.com/looly/hutool/
官方最新的API说明文档位于:https://apidoc.gitee.com/loolly/hutool/
使用示例位于:http://hutool.mydoc.io/#category_76195
●最甜的几块糖(Part 1)
以下章节将会重点介绍笔者觉得Hutool中最高效实用的几个类,涉及大量的举例代码,读者可以选择性的阅读,也可以作为手册,后期随时翻阅查看。需声明,以下代码均为笔者自行编写,非项目直接来源,大家无序对号入座,还请结合自己的实际业务去使用。
●类型转换
该类几乎是一个万能的类型转换工具类,提供了大量平时常用的类型转换函数,相比传统写法,会更简洁。举例几个经典例子:
1、String转换为Date。不需要进行异常捕获,转换失败返回null,而不抛出异常;同时也提供单参数与双参数的重载函数,后者在转换失败时返回给定值,该特性Convert中其他大多数函数也具备,下同,不再赘述
//传统写法
String string = "2018-11-11 00:00:01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = sdf.parse(string);
} catch (ParseException e) {
e.printStackTrace();
Date date = new Date();
}
//“糊涂”写法
String string = "2018-11-11 00:00:01";
Date date = Convert.toDate(string, new Date());
2、时间单位的转换,例如毫秒转化为天,避免了人为计算,也增加了代码的可读性,其中,该函数的第二第三个参数来自于java.util.concurrent下的枚举变量TimeUnit
long milliseconds = 145248462254L;
//传统写法
long day1 = milliseconds/1000/60/60/24;
//“糊涂”写法
long day2 = Convert.convertTime(milliseconds,TimeUnit.MILLISECONDS,TimeUnit.DAYS);
3、自定义转换器。如果Hutool提供的转换函数还不够用,想定义自己类的转换器,也是可以的。我们以代码为例,使用自定义转换器有两个步骤:一是继承Converter<T>接口,实现接口方法(插一句嘴,这是一个函数式接口,完全可以用Lambda的形式去实现,留给感兴趣的读者去尝试。本例将以传统方式书写);二是在转换器仓库ConverterRegistry中注册自定义的转换器,之后就可以使用了。
有如下两个类:报警树节点类与通用树节点类,二者不是继承关系,前者特有报警状态,但没有后者是否显示的标志位。
public class AlarmTreeNode {
private AlarmTreeNode childTreeNode;
private boolean isRoot;
private String alarmName;
private int deviceIndex;
private byte alarmStatus;
public AlarmTreeNode(){
this.childTreeNode = null;
this.isRoot = false;
this.alarmName = "";
this.deviceIndex = 0;
this.alarmStatus = 1;
}
public AlarmTreeNode(AlarmTreeNode childTreeNode, boolean isRoot, String alarmName, int deviceIndex, byte alarmStatus) {
this.childTreeNode = childTreeNode;
this.isRoot = isRoot;
this.alarmName = alarmName;
this.deviceIndex = deviceIndex;
this.alarmStatus = alarmStatus;
}
public AlarmTreeNode getChildTreeNode() {
return childTreeNode;
}
public void setChildTreeNode(AlarmTreeNode childTreeNode) {
this.childTreeNode = childTreeNode;
}
public boolean isRoot() {
return isRoot;
}
public void setRoot(boolean root) {
isRoot = root;