Hutool - 讓Java編程更高效

本文將介紹HuTool爲咱們提供的一些便捷工具。java

1、在項目的pom.xml的dependencies中加入如下內容:

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.7</version>
</dependency>
複製代碼

非Maven項目的話就本身百度下載一下jar包,導入便可。算法

2、StrUtil

看這裏名字也應該明白了,這是對字符串進行處理的工具類。shell

關於字符串,就沒什麼好介紹的了,直接來看看它爲咱們提供了哪些方法吧。數據庫

一、hasBlank、hasEmpty數組

這兩個方法都是用來判斷字符串是否爲空的,看以下代碼:bash

@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,兩個方法沒有歧義,統一認定其爲空。dom

二、removePrefix、removeSuffix分佈式

這兩個方法分別用於去除字符串的指定前綴和後綴。ide

看代碼:

@Test
//去除字符串的指定前綴和後綴
public void removePrefixOrremoveSuffixTest{
  String str1 = "test.jpg";
  //去除指定後綴
  System.out.println(StrUtil.removeSuffix(str1,".jpg"));
  //去除指定前綴
  System.out.println(StrUtil.removePrefix(str1,"test"));
}
複製代碼

運行結果:

test
.jpg
複製代碼

三、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
複製代碼

四、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);
}
複製代碼

運行結果:

絕山鳥飛千
複製代碼

3、URLUtil

該工具類專門用於處理url。

一、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
複製代碼

二、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
複製代碼

該方法經過文件名就能夠獲取到該文件的絕對路徑,這在使用絕對路徑的場景中很是方便。

三、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://頭的連接進行自動補全,並統一格式。

四、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
複製代碼

4、ObjectUtil

在咱們的平常使用中,有些方法是針對Object通用的,這些方法不區分何種對象,針對這些方法,Hutool封裝爲ObjectUtil

一、equal

該方法用於比較兩個對象是否相等,相等的條件有兩個:

  1. obj1 == && obj2 ==
  2. 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
複製代碼

二、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));
}
複製代碼

運行結果:

11
6
複製代碼

三、contains

該方法用於判斷給定的對象中是否還有指定的元素,代碼以下:

@Test
//對象中是否包含元素
//支持的對象類型包括:String Collection Map Iterator Enumeration Array
public void containsTest {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
boolean flag = ObjectUtil.contains(list, 1);
System.out.println(flag);
}
複製代碼

運行結果:

true
複製代碼

四、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
複製代碼

5、ReflectUtil

反射機制是Java的核心,Java框架的實現就使用到了大量的反射,HuTool針對Java反射作了一些封裝。

一、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
複製代碼

二、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
複製代碼

三、newInstance

該方法經過類的Class類型實例化對象,代碼以下:

@Test
//實例化對象
public void newInstanceTest {
  Object obj = ReflectUtil.newInstance(Object.class);
  boolean flag = ObjectUtil.is(obj);
  System.out.println(flag);
}
複製代碼

運行結果:

false
複製代碼

四、invoke

該方法用於執行對象中的方法,代碼以下:

@Test
//執行方法
public void invokeTest {
  ArrayList list = ReflectUtil.newInstance(ArrayList.class);
  ReflectUtil.invoke(list,"add",1);
  System.out.println(list);
}
複製代碼

運行結果:

[1]
複製代碼

其中第二個參數是要執行的方法名,第三個參數是要執行的方法參數。

6、ClipboardUtil

這是一個剪切板的工具類,用於簡化對剪切板的操做,某些場景下可能會使用到。

一、getStr

該方法用於獲取剪切板的內容,好比你用鼠標選取了一段內容進行復制,該方法就能夠獲取到複製的內容,代碼以下:

@Test
//從剪切板獲取文本內容
public void getStrTest {
  String str = ClipboardUtil.getStr;
  System.out.println(str);
}
複製代碼

運行結果:

String str = ClipboardUtil.getStr;
複製代碼

二、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
複製代碼

還有獲取圖片、設置圖片等等方法,你們能夠自行體驗。

7、ClassUtil

該類主要是封裝了一些反射的方法,使得調用更加方便。

一、getShortClassName

該方法用於獲取類名的短格式,代碼以下:

@Test
//獲取類名的短格式
public void getShortClassNameTest{
  String shortClassName = ClassUtil.getShortClassName("com.wwj.hutool.test.ObjectUtilTest");
  System.out.println(shortClassName);
}
複製代碼

運行結果:

c.w.h.t.ObjectUtilTest
複製代碼

二、getPackage

獲取指定類的包名,代碼以下:

@Test
//獲取指定類的包名
public void getPackageTest{
  String packageName = ClassUtil.getPackage(ObjectUtilTest.class);
  System.out.println(packageName);
}
複製代碼

運行結果:

com.wwj.hutool.test
複製代碼

三、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對象來過濾掉指定的類。

四、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
......
複製代碼

8、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
複製代碼

9、NumberUtil

這是針對數學運算的工具類,在傳統的Java開發中,常常會遇到小數之間的計算,而小數很容易丟失精度,爲了精確,一般會使用到BigDecimal類,但它們之間的轉換實在複雜。爲此,HuTool提供了NumberUtil類,使用該類進行數學計算將會很是輕鬆。

一、加減乘除

@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
複製代碼

二、保留小數

@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方法都可實現保留小數,默認使用四捨五入的模式,固然你也能夠傳入相應的模式改變程序。

三、數字判斷

NumberUtil提供了系列方法用於常見類型的數字判斷,由於很簡單,就不貼代碼了,直接看看方法名和做用便可。

  • NumberUtil.isNumber是否爲數字
  • NumberUtil.isInteger是否爲整數
  • NumberUtil.isDouble是否爲浮點數
  • NumberUtil.isPrimes是否爲質數

四、其它

固然還有一些比較常見的數學運算,NumberUtil也進行了相應的封裝。

  • NumberUtil.factorial階乘
  • NumberUtil.sqrt平方根
  • NumberUtil.divisor最大公約數
  • NumberUtil.multiple最小公倍數
  • NumberUtil.getBinaryStr得到數字對應的二進制字符串
  • NumberUtil.binaryToInt二進制轉int
  • NumberUtil.binaryToLong二進制轉long
  • NumberUtil.compare比較兩個值的大小
  • NumberUtil.toStr數字轉字符串,自動並去除尾小數點兒後多餘的0

10、IdUtil

該工具類主要用於生成惟一ID。

一、生成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。

二、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;
複製代碼

三、Snowflake

分佈式系統中,有一些須要使用全局惟一ID的場景,有些時候咱們但願能使用一種簡單一些的ID,而且但願ID可以按照時間有序生成。Twitter的Snowflake 算法就是這種生成器。

**缺點是:**強依賴於機器時間,若是機器時間回滾,則可能會致使id重複。

使用方法以下:

// 參數1爲終端ID,參數2爲數據中心ID// 參數一、2的取值範圍爲[0,32),整數intSnowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId;
複製代碼

注:也可使用 IdUtil.createSnowflake(1, 1) 來生成 Snowflake。若是與 for 循環聯用,則須要注意寫法,不然會產生重複 id。不過仍是建議使用 IdUtil.createSnowflake(1, 1) ,方便無重複。

11、ZipUtil

在Java中,對文件、文件夾打包,壓縮是一件比較繁瑣的事情,咱們經常引入Zip4j進行此類操做。可是不少時候,JDK中的zip包就可知足咱們大部分需求。ZipUtil就是針對java.util.zip作工具化封裝,使壓縮解壓操做能夠一個方法搞定,而且自動處理文件和目錄的問題,再也不須要用戶判斷,壓縮後的文件也會自動建立文件,自動建立父目錄,大大簡化的壓縮解壓的複雜度。

一、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。

二、GZip

Gzip是網頁傳輸中普遍使用的壓縮方式,Hutool一樣提供其工具方法簡化其過程。

ZipUtil.gzip壓縮,可壓縮字符串,也可壓縮文件ZipUtil.unGzip解壓Gzip文件

三、Zlib

ZipUtil.zlib壓縮,可壓縮字符串,也可壓縮文件ZipUtil.unZlib解壓zlib文件

12、IdCardUtil

在平常開發中,咱們對身份證的驗證主要是正則方式(位數,數字範圍等),可是中國身份證,尤爲18位身份證每一位都有嚴格規定,而且最後一位爲校驗位。而咱們在實際應用中,針對身份證的驗證理應嚴格至此。因而IdcardUtil應運而生。

IdcardUtil如今支持大陸15位、18位身份證,港澳臺10位身份證。

工具中主要的方法包括:

  1. isValidCard驗證身份證是否合法
  2. convert15To18身份證15位轉18位
  3. getBirthByIdCard獲取生日
  4. getAgeByIdCard獲取年齡
  5. getYearByIdCard獲取生日年
  6. getMonthByIdCard獲取生日月
  7. getDayByIdCard獲取生日天
  8. getGenderByIdCard獲取性別
  9. **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操做,使得咱們在操做一些比較複雜的內容時也能輕鬆應對。

做者公衆號:「哥說網事」 做者主頁:www.goodsoon.com

相關文章
相關標籤/搜索