Hutool - 简化Java编程的法宝,让工作更高效
上篇文章介绍到了HuTool项目中提供的一些组件,但HuTool的功能可远不止如此,接下来,我将介绍HuTool为我们提供的一些便捷工具。
如果你没有看过之前的文章,也不要紧,这并不影响你对接下来的内容的理解,不过为了照顾直接看到第二篇的同学,还是有必要介绍一下HuTool的引入方式。
在项目的pom.xml的dependencies中加入以下内容:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.0.7</version>
</dependency>
非Maven项目的话就自己百度下载一下jar包,导入即可。
StrUtil
看这里名字也应该明白了,这是对字符串进行处理的工具类。
关于字符串,就没什么好介绍的了,直接来看看它为我们提供了哪些方法吧。
1、hasBlank、hasEmpty
这两个方法都是用来判断字符串是否为空的,看如下代码:
@Test
//判断字符串是否为空
public void hasBlankOrhasEmptyTest(){String str1 = " ";String str2 = "";System.out.println(StrUtil.hasBlank(str1));System.out.println(StrUtil.hasBlank(str2));System.out.println(StrUtil.hasEmpty(str1));System.out.println(StrUtil.hasEmpty(str2));
}
运行结果:
true
true
false
true
需要注意的就是,虽然这两个方法的作用都是判断给定的字符串是否为空,但是hasEmpty方法只能判断为null和空字符串(""),而hasBlank方法还会将不可见字符也视为空。比如上面的程序中,对于str1,它的值为不可见的字符(空格),hasEmpty方法该字符串不为空,而hasBlank方法认为该字符串为空;但对于str2,两个方法没有歧义,统一认定其为空。
2、removePrefix、removeSuffix
这两个方法分别用于去除字符串的指定前缀和后缀。
看代码:
@Test//去除字符串的指定前缀和后缀public void removePrefixOrremoveSuffixTest(){String str1 = "test.jpg";//去除指定后缀System.out.println(StrUtil.removeSuffix(str1,".jpg"));//去除指定前缀System.out.println(StrUtil.removePrefix(str1,"test"));}
运行结果:
test
.jpg
3、sub
该方法改进自JDK提供的subString方法,还记得JDK的subString方法是做什么的吗?
它是用来截取字符串的,通过给定索引返回对应的子串,由于传统的subString方法问题实在太多,你问我有什么问题?看代码:
@Testpublic void subTest(){String str = "hello world";System.out.println(str.substring(0,12));}
在这段程序中,字符串str的长度为11,但在截取字符串长度的时候却截取到12,显然是索引越界了,但有时候我们很容易犯这种错误,可运行直接报错并不是一个好的方式。为此,StrUtil为我们提供了sub方法,它考虑到了各种需要考虑的情况并做了相应的处理,同时,它还支持索引为负数,-1表示最后一个字符,这是Python的风格,作者应该是个Python迷。
代码如下:
@Test//截取字符串//index从0开始计算,最后一个字符为-1//如果from和to位置一样,返回 ""//如果from或to为负数,则按照length从后向前数位置,如果绝对值大于字符串长度,则from归到0,to归到length//如果经过修正的index中from大于to,则互换from和topublic void subTest(){String str = "hello world";System.out.println(StrUtil.sub(str,0,12));}
此时即使你的索引位置极其离谱,sub方法也能轻松应对,该程序的运行结果为:
hello world
4、format
该方法用于格式化文本,可以使用字符串模板代替字符串拼接,看代码:
@Test//格式化文本public void formatTest(){String str = "{}山鸟飞{}";String formatStr = StrUtil.format(str, "千", "绝");System.out.println(formatStr);}
运行结果:
千山鸟飞绝
该方法通过{}作为占位符,然后按照参数顺序替换占位符,所以参数的位置一定要注意,如果把"绝"字放在前面,那结果就不一样了。
@Test//格式化文本public void formatTest(){String str = "{}山鸟飞{}";String formatStr = StrUtil.format(str, "绝", "千");System.out.println(formatStr);}
运行结果:
绝山鸟飞千
URLUtil
该工具类专门用于处理url。
1、url
通过该方法可以将一个字符串转换为URL对象,代码如下:
@Test//将字符串转换为URL对象public void urlTest() {URL url = URLUtil.url("http://localhost:8080/name=zhangsan&age=20");//获取URL中域名部分,只保留URL中的协议URI uri = URLUtil.getHost(url);System.out.println(uri);}
运行结果:
http://localhost
2、getURL
该方法用于获得URL,常用于使用绝对路径时的情况 ,代码如下:
@Test//获得URL,常用于使用绝对路径时的情况public void getURLTest() {URL url = URLUtil.getURL(FileUtil.file("URLUtilTest.java"));System.out.println(url.toString());}
运行结果:
file:/C:/Users/Administrator/Desktop/ideaworkspace/HuTool/out/production/HuTool/URLUtilTest.java
该方法通过文件名就可以获取到该文件的绝对路径,这在使用绝对路径的场景中非常方便。
3、normalize
该方法用于标准化URL链接,代码如下:
@Test//标准化化URL链接public void normalizeTest() {String url = "www.baidu.com\\example\\test/a";String newUrl = URLUtil.normalize(url);System.out.println(newUrl);}
运行结果:
http://www.baidu.com/example/test/a
该方法会对不带http://头的链接进行自动补全,并统一格式。
4、getPath
该方法用于获取URL链接中的path部分字符串,比如:
@Test//获得path部分public void getPathTest() {String url = "http://localhost/search?name=abc&age=20";String pathStr = URLUtil.getPath(url);System.out.println(pathStr);}
运行结果:
/search
ObjectUtil
在我们的日常使用中,有些方法是针对Object通用的,这些方法不区分何种对象,针对这些方法,Hutool封装为ObjectUtil
。
1、equal
该方法用于比较两个对象是否相等,相等的条件有两个:
obj1 == null && obj2 == null
obj1.equal(obj2)
这两个条件满足其中一个就表示这两个对象相等,代码如下:
@Test//比较两个对象是否相等。//相同的条件有两个,满足其一即可://obj1 == null && obj2 == null obj1.equals(obj2)public void equalTest() {Object obj = null;Object obj2 = null;boolean equal = ObjectUtil.equal(obj, obj2);System.out.println(equal);}
运行结果:
true
2、length
该方法用于计算传入对象的长度,如果传入的是字符串,则计算字符串长度;如果传入的是集合,则计算集合大小;length方法会自动调用对应类型的长度计算方法。
@Test//计算对象长度,如果是字符串调用其length函数,集合类调用其size函数,数组调用其length属性,其他可遍历对象遍历计算长度//支持的类型包括:CharSequence Map Iterator Enumeration Arraypublic void lengthTest() {String str = "hello world";List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);System.out.println(ObjectUtil.length(str));System.out.println(ObjectUtil.length(list));}
运行结果:
11
6
3、contains
该方法用于判断给定的对象中是否还有指定的元素,代码如下:
@Test//对象中是否包含元素//支持的对象类型包括:String Collection Map Iterator Enumeration Arraypublic void containsTest() {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);boolean flag = ObjectUtil.contains(list, 1);System.out.println(flag);}
运行结果:
true
4、isBasicType
该方法用于判断给定的对象是否为基本类型,包括包装类型和非包装类型 ,代码如下:
@Test//是否为基本类型,包括包装类型和非包装类型public void isBasicTypeTest(){String str = "hello";int num = 100;boolean flag = ObjectUtil.isBasicType(str);boolean flag2 = ObjectUtil.isBasicType(num);System.out.println(flag);System.out.println(flag2);}
运行结果:
false
true
ReflectUtil
反射机制是Java的核心,Java框架的实现就使用到了大量的反射,HuTool针对Java反射做了一些封装。
1、getMethods
该方法用于获取一个类中所有的方法,包括其父类中的方法。
@Test//获得一个类中所有方法列表,包括其父类中的方法public void getMethodsTest() {Method[] methods = ReflectUtil.getMethods(Object.class);for (Method method : methods) {System.out.println(method.getName());}}
运行结果:
finalize
wait
wait
wait
equals
toString
hashCode
getClass
clone
notify
notifyAll
registerNatives
2、getMethod
该方法用于获取某个类的指定方法,代码如下:
@Test//获取某个类的指定方法public void getMethodsTest() {Method method = ReflectUtil.getMethod(Object.class, "getClass");System.out.println(method);}
运行结果:
public final native java.lang.Class java.lang.Object.getClass()
3、newInstance
该方法通过类的Class类型实例化对象,代码如下:
@Test//实例化对象public void newInstanceTest() {Object obj = ReflectUtil.newInstance(Object.class);boolean flag = ObjectUtil.isNull(obj);System.out.println(flag);}
运行结果:
false
4、invoke
该方法用于执行对象中的方法,代码如下:
@Test//执行方法public void invokeTest() {ArrayList list = ReflectUtil.newInstance(ArrayList.class);ReflectUtil.invoke(list,"add",1);System.out.println(list);}
运行结果:
[1]
其中第二个参数是要执行的方法名,第三个参数是要执行的方法参数。
ClipboardUtil
这是一个剪切板的工具类,用于简化对剪切板的操作,某些场景下可能会使用到。
1、getStr
该方法用于获取剪切板的内容,比如你用鼠标选取了一段内容进行复制,该方法就可以获取到复制的内容,代码如下:
@Test//从剪切板获取文本内容public void getStrTest() {String str = ClipboardUtil.getStr();System.out.println(str);}
运行结果:
String str = ClipboardUtil.getStr();
2、setStr
该方法用于设置剪切板的内容,即:将指定的字符串设置到剪切板上,相当于你复制了该内容,代码如下:
@Test//设置剪切板文本内容public void setStrTest() {String str = ClipboardUtil.getStr();System.out.println(str);ClipboardUtil.setStr("hello world");String str2 = ClipboardUtil.getStr();System.out.println(str2);}
运行结果:
String str = ClipboardUtil.getStr();
hello world
还有获取图片、设置图片等等方法,大家可以自行体验。
ClassUtil
该类主要是封装了一些反射的方法,使得调用更加方便。
1、getShortClassName
该方法用于获取类名的短格式,代码如下:
@Test//获取类名的短格式public void getShortClassNameTest(){String shortClassName = ClassUtil.getShortClassName("com.wwj.hutool.test.ObjectUtilTest");System.out.println(shortClassName);}
运行结果:
c.w.h.t.ObjectUtilTest
2、getPackage
获取指定类的包名,代码如下:
@Test//获取指定类的包名public void getPackageTest(){String packageName = ClassUtil.getPackage(ObjectUtilTest.class);System.out.println(packageName);}
运行结果:
com.wwj.hutool.test
3、scanPackage
这个方法是该工具类的核心,这是一个扫描包下资源的方法,在Spring中用于依赖注入,代码如下:
@Test//扫描包下资源public void scanPackageTest(){Set<Class<?>> classes = ClassUtil.scanPackage("com.wwj.hutool.test");for (Class<?> aclass : classes) {System.out.println(aclass.getName());}}
运行结果:
com.wwj.hutool.test.URLUtilTest
com.wwj.hutool.test.StrUtilTest
com.wwj.hutool.test.ObjectUtilTest
该方法需要传递一个包名作为参数,然后便会在指定的包下扫描所有的类,你还可以通过传入ClassFilter对象来过滤掉指定的类。
4、getJavaClassPaths
该方法用于获取Java的系统变量定义的ClassPath。
@Testpublic void scanPackageTest(){String[] javaClassPaths = ClassUtil.getJavaClassPaths();for (String javaClassPath : javaClassPaths) {System.out.println(javaClassPath);}}
运行结果:
F:\Tool\IntelliJ IDEA 2018.3\lib\idea_rt.jar
F:\Tool\IntelliJ IDEA 2018.3\plugins\junit\lib\junit-rt.jar
F:\Tool\IntelliJ IDEA 2018.3\plugins\junit\lib\junit5-rt.jar
E:\Java\jdk1.8.0_181\jre\lib\charsets.jar
E:\Java\jdk1.8.0_181\jre\lib\deploy.jar
......
RuntimeUtil
该工具类用于执行命令行命令,在Windows下是cmd,在Linux下是shell。
因为很简单,这里就直接贴出代码即可:
@Testpublic void RunTimeUtilTest(){String str = RuntimeUtil.execForStr("ipconfig");System.out.println(str);}
运行结果:
Windows IP 配置以太网适配器 以太网:媒体状态 . . . . . . . . . . . . : 媒体已断开连接连接特定的 DNS 后缀 . . . . . . . :无线局域网适配器 本地连接* 1:媒体状态 . . . . . . . . . . . . : 媒体已断开连接连接特定的 DNS 后缀 . . . . . . . :无线局域网适配器 本地连接* 2:媒体状态 . . . . . . . . . . . . : 媒体已断开连接连接特定的 DNS 后缀 . . . . . . . :无线局域网适配器 WLAN:连接特定的 DNS 后缀 . . . . . . . : www.tendawifi.com本地链接 IPv6 地址. . . . . . . . : fe80::830:2d92:1427:a434%17IPv4 地址 . . . . . . . . . . . . : 192.168.0.103子网掩码 . . . . . . . . . . . . : 255.255.255.0默认网关. . . . . . . . . . . . . : 192.168.0.1
NumberUtil
这是针对数学运算的工具类,在传统的Java开发中,经常会遇到小数之间的计算,而小数很容易丢失精度,为了精确,通常会使用到BigDecimal类,但它们之间的转换实在复杂。为此,HuTool提供了NumberUtil类,使用该类进行数学计算将会非常轻松。
1、加减乘除
@Testpublic void calcTest(){double d = 3.5;float f = 0.5f;System.out.println(NumberUtil.add(d,f));//加System.out.println(NumberUtil.sub(d,f));//减System.out.println(NumberUtil.mul(d,f));//乘System.out.println(NumberUtil.div(d,f));//除}
运行结果:
4.0
3.0
1.75
7.0
2、保留小数
@Testpublic void calcTest(){double d = 1234.56789;System.out.println(NumberUtil.round(d,2));System.out.println(NumberUtil.roundStr(d,3));}
运行结果:
1234.57
1234.568
通过round和roundStr方法均可实现保留小数,默认使用四舍五入的模式,当然你也可以传入相应的模式改变程序。
3、数字判断
NumberUtil提供了系列方法用于常见类型的数字判断,因为很简单,就不贴代码了,直接看看方法名和作用即可。
NumberUtil.isNumber
是否为数字NumberUtil.isInteger
是否为整数NumberUtil.isDouble
是否为浮点数NumberUtil.isPrimes
是否为质数
4、其它
当然还有一些比较常见的数学运算,NumberUtil也进行了相应的封装。
NumberUtil.factorial
阶乘NumberUtil.sqrt
平方根NumberUtil.divisor
最大公约数NumberUtil.multiple
最小公倍数NumberUtil.getBinaryStr
获得数字对应的二进制字符串NumberUtil.binaryToInt
二进制转intNumberUtil.binaryToLong
二进制转longNumberUtil.compare
比较两个值的大小NumberUtil.toStr
数字转字符串,自动并去除尾小数点儿后多余的0
IdUtil
该工具类主要用于生成唯一ID。
1、生成UUID
@Testpublic void IdUtilTest(){String uuid = IdUtil.randomUUID();String simpleUUID = IdUtil.simpleUUID();System.out.println(uuid);System.out.println(simpleUUID);}
运行结果:
b1e4e753-39b9-4026-8a08-ce9837e15f62
23f1603604694d029bb35c1c03d7aeb1
ramdimUUID方法生成的是带'-'的UUID,而simpleUUID方法生成的是不带'-'的UUID。
2、ObjectId
ObjectId是MongoDB数据库的一种唯一ID生成策略,是UUID version1的变种 。
Hutool针对此封装了cn.hutool.core.lang.ObjectId
,快捷创建方法为:
//生成类似:5b9e306a4df4f8c54a39fb0c
String id = ObjectId.next();//方法2:从Hutool-4.1.14开始提供
String id2 = IdUtil.objectId();
3、Snowflake
分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。Twitter的Snowflake 算法就是这种生成器。
缺点是:强依赖于机器时间,如果机器时间回滚,则可能会导致id重复。
使用方法如下:
// 参数1为终端ID,参数2为数据中心ID
// 参数1、2的取值范围为[0,32),整数int
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId();
create17 注:
也可以使用 IdUtil.createSnowflake(1, 1) 来生成 Snowflake。如果与 for() 循环联用,则需要注意写法,否则会产生重复 id。
不过还是建议使用 IdUtil.createSnowflake(1, 1) ,方便无重复。
ZipUtil
在Java中,对文件、文件夹打包,压缩是一件比较繁琐的事情,我们常常引入Zip4j进行此类操作。但是很多时候,JDK中的zip包就可满足我们大部分需求。ZipUtil就是针对java.util.zip做工具化封装,使压缩解压操作可以一个方法搞定,并且自动处理文件和目录的问题,不再需要用户判断,压缩后的文件也会自动创建文件,自动创建父目录,大大简化的压缩解压的复杂度。
1、Zip
@Testpublic void zipUtilTest(){ZipUtil.zip("C:/Users/Administrator/Desktop/test.txt");}
观察桌面:
压缩成功。
当然了,你也可以指定压缩后的压缩包存放位置,将路径作为第二个参数传入zip方法即可。
多文件或目录压缩。可以选择多个文件或目录一起打成zip包 :
@Testpublic void zipUtilTest() {ZipUtil.zip(FileUtil.file("d:/bbb/ccc.zip"), false,FileUtil.file("d:/test1/file1.txt"),FileUtil.file("d:/test1/file2.txt"),FileUtil.file("d:/test2/file1.txt"),FileUtil.file("d:/test2/file2.txt"));}
解压操作和压缩一样,不重复讲解,解压方法为unzip。
2、GZip
Gzip是网页传输中广泛使用的压缩方式,Hutool同样提供其工具方法简化其过程。
ZipUtil.gzip
压缩,可压缩字符串,也可压缩文件 ZipUtil.unGzip
解压Gzip文件
3、Zlib
ZipUtil.zlib
压缩,可压缩字符串,也可压缩文件 ZipUtil.unZlib
解压zlib文件
IdCardUtil
在日常开发中,我们对身份证的验证主要是正则方式(位数,数字范围等),但是中国身份证,尤其18位身份证每一位都有严格规定,并且最后一位为校验位。而我们在实际应用中,针对身份证的验证理应严格至此。于是IdcardUtil
应运而生。
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, "内蒙古");
最后
本篇文章也只是例举了HuTool中的部分工具类,实际上,HuTool是一个非常完美的项目,实现了很多Java操作,使得我们在操作一些比较复杂的内容时也能轻松应对。
关于HuTool的更多内容,大家可以自己去了解一下。官方文档链接:
https://www.hutool.cn/docs/index.html#/
欢迎大家留言讨论
???? ???? ????
Hutool - 简化Java编程的法宝,让工作更高效相关推荐
- 简化Java编程的法宝,让工作更高效
上篇文章介绍到了HuTool项目中提供的一些组件,但HuTool的功能可远不止如此,接下来,我将介绍HuTool为我们提供的一些便捷工具. 如果你没有看过之前的文章,也不要紧,这并不影响你对接下来的内 ...
- 钉钉邮箱登录入口_清博舆情钉钉小程序上线 ,五大优势三大亮点助力工作更高效...
清博大数据在多项赛事与微软.Google.阿里.百度等团队同台竞技并获得:第28届中国计算语言大会CCL2019中文幽默比赛冠军:互联网虚假新闻检测2019全球挑战赛多模态识别技术冠军:2020年&q ...
- 图解研发效能:让过程被看见,让工作更高效
前面我的同事分别从需求协作.代码协同和应用发布三方面,和我们分享了如何通过云效完成日常的产品研发.当我们的工作活动都在云效上时,这便就有了度量的数据基础. 在很多文章中我们看到的是,效能洞察主要是帮助 ...
- 新一代三维GIS技术助力灭火救援工作更高效、更标准、更科学
2009年,SuperMap发布了首款二三维一体化GIS软件,并首次提出了二三维一体化GIS技术.随后,二三维一体化的应用系统不断涌现,二三维一体化技术逐步成为三维GIS发展和研究的主流.2017年, ...
- java编程能做什么_学习Java编程能做什么工作?
Java作为编程语言界最时髦流行的元老之一,现今在软件市场上也是宠儿,被各大企业广泛应用到生产中.在各种行业.各个企业的业务管理平台,如门户网站等许多方面都占据了主导地位.吸引着越来越多学习Java的 ...
- java在理科应用_理科生学JAVA编程怎么样才能学的更好
作为一名理科生,学习JAVA编程是有一定优势的,逻辑思维能力强,而且对数字代码敏感.在IT培训网学校几个月来,结合自己总结了一引动学习方法,应用在java开发学习中感觉效果还不错. 结合自身特点 将复 ...
- 樊登高效休息法心得400字_从3个方面入手,让运营工作更高效!
(本文转载自姑婆那些事儿APP) 做运营的似乎都有一个很深的体会:每天的工作时间很多,但是产出却很低.或者,早上计划好的事情,到了晚上下班却还没有完成,不得不通过加班来完成工作内容. 这实际都在指出一 ...
- 神器集合!这12个免费工具可以让您的工作更高效
好的工具,能够帮助我们更高效地完成工作,节省时间和精力; 节省出更多的摸鱼时间! 本文将介绍 12 款绝佳的免费效率工具,这些工具可以让你事半功倍,提高工作效率.无论你是一名程序员.设计师.学生还是白 ...
- 有数字化肢体语言的线索评分:让工作更高效
线索评分是增加转化率的诀窍:如果你希望确保销售线索按时保质的交付给你的销售团队则需要规范交接条件, 我们将此称之为自动化的质量保证. 高分值表示你的潜在客户非常感兴趣并有意购买,低分则相反,就这么简单 ...
最新文章
- wowpve服务器优势,PVE服务器法师对本职业的一点看法
- linux内核合并dtb文件,c – 如何修改内核DTB文件
- 知识图谱实体链接:一份“由浅入深”的综述
- c++ map iterator 获取key_JAVA | Map集合使用详解
- PostgreSQL的clog—从事务回滚速度谈起
- Centos7 下安装mariadb及其基本操作
- 让cp显示进度的脚本
- AlwaysOn业务IP和高可用IP分开使用(四)
- 数据结构和算法9——哈希表
- mysql rm-rf_rm-rf误操作的恢复过程
- 计算机领域 专利挖掘,浅谈如何进行软件专利的挖掘
- [Codeforces] AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结+题解
- 【坚持每日一题9.21】整数的英语表示
- RAID磁盘阵列配置
- directx.sys和svchost.com
- 设置Layui表格字段的字体颜色
- HTML CSS基本知识点总结
- 四样融合!对东软刘积仁的战略布局,大写的服!
- 3主3从redis集群扩缩容配置案例说明
- STM32 10进制转16进制,16进制转10进制 超简单