上篇文章介紹到了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方法只能判斷為和空字符串(""),而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方法問題實在太多,你問我有什麼問題?看代碼:
@Test
public 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和to
public 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封裝為<code>ObjectUtil/<code>。
1、equal
該方法用於比較兩個對象是否相等,相等的條件有兩個:
obj1 == && obj2 ==
obj1.equal(obj2)
這兩個條件滿足其中一個就表示這兩個對象相等,代碼如下:
@Test
//比較兩個對象是否相等。
//相同的條件有兩個,滿足其一即可:
//obj1 == && obj2 == obj1.equals(obj2)
public void equalTest {
Object obj = ;
Object obj2 = ;
boolean equal = ObjectUtil.equal(obj, obj2);
System.out.println(equal);
}
運行結果:
true
2、length
該方法用於計算傳入對象的長度,如果傳入的是字符串,則計算字符串長度;如果傳入的是集合,則計算集合大小;length方法會自動調用對應類型的長度計算方法。
@Test
//計算對象長度,如果是字符串調用其length函數,集合類調用其size函數,數組調用其length屬性,其他可遍歷對象遍歷計算長度
//支持的類型包括:CharSequence Map Iterator Enumeration Array
public 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));
}
/<integer>
運行結果:
11
6
3、contains
該方法用於判斷給定的對象中是否還有指定的元素,代碼如下:
@Test
//對象中是否包含元素
//支持的對象類型包括:String Collection Map Iterator Enumeration Array
public void containsTest {
List<integer> l ist = Arrays.asList(1, 2, 3, 4, 5, 6);
boolean flag = ObjectUtil.contains(list, 1);
System.out.println(flag);
}
/<integer>
運行結果:
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
regis terNatives
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.is(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);
}
}
/<class>
運行結果:
com.wwj.hutool.test.URLUtilTest
com.wwj.hutool.test.StrUtilTest
com.wwj.hutool.test.ObjectUtilTest
該方法需要傳遞一個包名作為參數,然後便會在指定的包下掃描所有的類,你還可以通過傳入ClassFilter對象來過濾掉指定的類。
4、getJavaClassPaths
該方法用於獲取Java的系統變量定義的ClassPath。
@Test
public 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。
因為很簡單,這裡就直接貼出代碼即可:
@Test
public 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%17
IPv4 地址 . . . . . . . . . . . . : 192.168.0.103
子網掩碼 . . . . . . . . . . . . : 255.255.255.0
默認網關. . . . . . . . . . . . . : 192.168.0.1
NumberUtil
這是針對數學運算的工具類,在傳統的Java開發中,經常會遇到小數之間的計算,而小數很容易丟失精度,為了精確,通常會使用到BigDecimal類,但它們之間的轉換實在複雜。為此,HuTool提供了NumberUtil類,使用該類進行數學計算將會非常輕鬆。
1、加減乘除
@Test
public 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、保留小數
@Test
public 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提供了系列方法用於常見類型的數字判斷,因為很簡單,就不貼代碼了,直接看看方法名和作用即可。
<code>NumberUtil.isNumber/<code>是否為數字
<code>NumberUtil.isInteger/<code>是否為整數
<code>NumberUtil.isDouble/<code>是否為浮點數
<code>NumberUtil.isPrimes/<code>是否為質數
4、其它
當然還有一些比較常見的數學運算,NumberUtil也進行了相應的封裝。
<code>NumberUtil.factorial/<code>階乘
<code>NumberUtil.sqrt/<code>平方根
<code>NumberUtil.divisor/<code>最大公約數
<code>NumberUtil.multiple/<code>最小公倍數
<code>NumberUtil.getBinaryStr/<code>獲得數字對應的二進制字符串
<code>NumberUtil.binaryToInt/<code>二進制轉int
<code>NumberUtil.binaryToLong/<code>二進制轉long
<code>NumberUtil.compare/<code>比較兩個值的大小
<code>NumberUtil.toStr/<code>數字轉字符串,自動並去除尾小數點兒後多餘的0
IdUtil
該工具類主要用於生成唯一ID。
1、生成UUID
@Test
public 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針對此封裝了<code>cn.hutool.core.lang.ObjectId /<code>,快捷創建方法為:
//生成類似: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
@Test
public void zipUtilTest{
ZipUtil.zip("C:/Users/Administrator/Desktop/test.txt");
}
觀察桌面:
壓縮成功。
當然了,你也可以指定壓縮後的壓縮包存放位置,將路徑作為第二個參數傳入zip方法即可。
多文件或目錄壓縮。可以選擇多個文件或目錄一起打成zip包 :
@Test
public 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同樣提供其工具方法簡化其過程。
<code>ZipUtil.gzip/<code>壓縮,可壓縮字符串,也可壓縮文件<code>ZipUtil.unGzip/<code>解壓Gzip文件
3、Zlib
<code>ZipUtil.zlib/<code>壓縮,可壓縮字符串,也可壓縮文件<code>ZipUtil.unZlib/<code>解壓zlib文件
IdCardUtil
在日常開發中,我們對身份證的驗證主要是正則方式(位數,數字範圍等),但是中國身份證,尤其18位身份證每一位都有嚴格規定,並且最後一位為校驗位。而我們在實際應用中,針對身份證的驗證理應嚴格至此。於是<code>IdcardUtil/<code>應運而生。
<code>IdcardUtil/<code>現在支持大陸15位、18位身份證,港澳臺10位身份證。
工具中主要的方法包括:
<code>isValidCard/<code>驗證身份證是否合法
<code>convert15To18/<code>身份證15位轉18位
<code>getBirthByIdCard/<code>獲取生日
<code>getAgeByIdCard/<code>獲取年齡
<code>getYearByIdCard/<code>獲取生日年
<code>getMonthByIdCard/<code>獲取生日月
<code>getDayByIdCard/<code>獲取生日天
<code>getGenderByIdCard/<code>獲取性別
<code>getProvinceByIdCard /<code>獲取省份
使用
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操作,使得我們在操作一些比較複雜的內容時也能輕鬆應對。
閱讀更多 大數據實戰演練 的文章