前言
工具箱清单
Hutool是个好类库
简介
Hutool如何改变我们的coding方式
包含组件
引入
感谢Hutool
农历日期-ChineseDate
身份证工具-IdcardUtil
社会信用代码工具-CreditCodeUtil
拼音工具-PinyinUtil
上周出了个急差,导致这几天生物钟有些紊乱。今天屡屡思路说一说项目中,常用到的工具类。工具类的出现可以简化代码同时也提高了Coding效率。(提高工作效率是不是便宜了老板?其实不然,真正受益的还是自己,毕竟搬砖的工作是不可能被老板代替的)
提示:目前有很多框架或其他类库已经帮助开发者封装了很多非常实用的工具类,如果你恰好熟悉它,那就拿来用吧。有时不想引入其他资源库,那就动手写个专属自己的工具类吧。
项目中常用的工具类有很多,以Java程序员为例,工具箱中可能包含但不限于JDBC、日期格式、字符转换、数字格式、文件操作(XML/World/Excel/PDF...)、JSON转换、集合数组、Http/gRPC等。
写到这里时,正思考该怎么将工具类一一展示出来,
这时身边的帅哥同事,热心的向我介绍了Hutool
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。
以计算MD5为例:
Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。
一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:
模块 | 介绍 |
---|---|
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)封装实现 |
Hutool-all
是一个Hutool的集成打包产品,由于考虑到“懒人”用户及分不清各个模块作用的用户,“无脑”引入hutool-all
模块是快速开始和深入应用的最佳方式。
起初Hutool只提供了两种引入方式:
引入hutool-all
以便使用所有工具类功能
引入hutool-xxx
单独模块使用
后来t-io
的作者谭总提出是否可以引入一个bom包,一次性引入所有子模块,然后将不用的模块排除掉。起初我是排斥的,认为这种方式用处不大(其实是我不会写……)
再后来接触了Maven的这部分,于是有了hutool-bom
模块!
当然这个模块的存在一直有争议,因为真正的bom包是一个模块管理包,正确的打开方式是可以引入,再引入需要的模块(只是不用重复版本号而已),Hutool中"排除"方式就变得非常异类,真是让人头大。
当然转机来自于一个issue:BOM should be declared in dependencyManagement for import(opens new window)
@JasonMing 大神给了一个非常棒的方案,可以两者兼得,于是纠结症的我终于释怀了,现在的bom模块变得异常灵活!
整个bom模块只由一个pom.xml组成,同时提供了dependencyManagement
和dependencies
两种声明。于是我们就可以针对不同需要完成引入。
如果你想像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
cn.hutool
hutool-bom
${hutool.version}
pom
import
在子模块中就可以引入自己需要的模块了:
cn.hutool
hutool-http
使用import的方式,只会引入hutool-bom内的dependencyManagement的配置,其它配置在这个引用方式下完全不起作用。
如果你引入的模块比较多,但是某几个模块没用,你可以:
cn.hutool
hutool-bom
${hutool.version}
pom
cn.hutool
hutool-system
这个配置会传递依赖hutool-bom内所有dependencies的内容,当前hutool-bom内的dependencies全部设置了version,就意味着在maven resolve的时候hutool-bom内就算存在dependencyManagement也不会产生任何作用。
参考:简介 | Hutool
Hutool有点感动到我了,里面大量适合国人的工具方法。下面举几个例子。
农历日期,提供了生肖、天干地支、传统节日等方法。
1.构建ChineseDate
对象
ChineseDate
表示了农历的对象,构建此对象既可以使用公历的日期,也可以使用农历的日期。
//通过农历构建
ChineseDate chineseDate = new ChineseDate(1992,12,14);
//通过公历构建
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate("1993-01-06"));
2.基本使用
//通过公历构建
ChineseDate date = new ChineseDate(DateUtil.parseDate("2020-01-25"));
// 一月
date.getChineseMonth();
// 正月
date.getChineseMonthName();
// 初一
date.getChineseDay();
// 庚子
date.getCyclical();
// 生肖:鼠
date.getChineseZodiac();
// 传统节日(部分支持,逗号分隔):春节
date.getFestivals();
// 庚子鼠年 正月初一
date.toString();
3.获取天干地支
从5.4.1
开始,Hutool支持天干地支的获取:
//通过公历构建
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate("2020-08-28"));
// 庚子年甲申月癸卯日
String cyclicalYMD = chineseDate.getCyclicalYMD();
在日常开发中,我们对身份证的验证主要是正则方式(位数,数字范围等),但是中国身份证,尤其18位身份证每一位都有严格规定,并且最后一位为校验位。而我们在实际应用中,针对身份证的验证理应严格至此。于是IdcardUtil
应运而生。
IdcardUtil
从3.0.4版本起加入Hutool工具家族,升级至此版本以上可使用。
IdcardUtil
现在支持大陆15位、18位身份证,港澳台10位身份证。
工具中主要的方法包括:
isValidCard
验证身份证是否合法convert15To18
身份证15位转18位getBirthByIdCard
获取生日getAgeByIdCard
获取年龄getYearByIdCard
获取生日年getMonthByIdCard
获取生日月getDayByIdCard
获取生日天getGenderByIdCard
获取性别getProvinceByIdCard
获取省份
String ID_18 = "321083197812162119";
String ID_15 = "150102880730303";
//是否有效
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
//转换
String convert15To18 = IdcardUtil.convert15To18(ID_15);
Assert.assertEquals(convert15To18, "150102198807303035");
//年龄
DateTime date = DateUtil.parse("2017-04-10");
int age = IdcardUtil.getAgeByIdCard(ID_18, date);
Assert.assertEquals(age, 38);
int age2 = IdcardUtil.getAgeByIdCard(ID_15, date);
Assert.assertEquals(age2, 28);
//生日
String birth = IdcardUtil.getBirthByIdCard(ID_18);
Assert.assertEquals(birth, "19781216");
String birth2 = IdcardUtil.getBirthByIdCard(ID_15);
Assert.assertEquals(birth2, "19880730");
//省份
String province = IdcardUtil.getProvinceByIdCard(ID_18);
Assert.assertEquals(province, "江苏");
String province2 = IdcardUtil.getProvinceByIdCard(ID_15);
Assert.assertEquals(province2, "内蒙古");
声明 以上两个身份证号码为随机编造的,如有雷同,纯属巧合。
法人和其他组织统一社会信用代码制度,相当于让法人和其他组织拥有了一个全国统一的“身份证号”。
规则如下:
此工具主要提供校验和随机生成。
String testCreditCode = "91310110666007217T";
// true
CreditCodeUtil.isCreditCode(testCreditCode);
final String s = CreditCodeUtil.randomCreditCode();
拼音工具类在旧版本的Hutool中在core包中,但是发现自己实现相关功能需要庞大的字典,放在core包中便是累赘。
于是为了方便,Hutool封装了拼音的门面,用于兼容以下拼音库:
和其它门面模块类似,采用SPI方式识别所用的库。例如你想用Pinyin4j,只需引入jar,Hutool即可自动识别。
以下为Hutool支持的拼音库的pom坐标,你可以选择任意一个引入项目中,如果引入多个,Hutool会按照以上顺序选择第一个使用。
io.github.biezhi
TinyPinyin
2.0.3.RELEASE
com.belerweb
pinyin4j
2.5.1
com.github.stuxuhai
jpinyin
1.1.8
1.获取拼音
// "ni hao"
String pinyin = PinyinUtil.getPinyin("你好", " ");
这里定义的分隔符为空格,你也可以按照需求自定义分隔符,亦或者使用""
代表无分隔符。
2.获取拼音首字母
// "h, s, d, y, g"
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");
3.自定义拼音库(拼音引擎)
Pinyin4jEngine engine = new Pinyin4jEngine();
// "ni hao h"
String pinyin = engine.getPinyin("你好h", " ");
希望我们的代码越写越好,软硬件都越来越强大!OSCHINA - 中文开源技术交流社区https://www.oschina.net/