真香!使用這九款Java工具,開發(fā)效率提升80%
在現(xiàn)代軟件開發(fā)中,常常會遇到各種工具類,這些工具類能夠極大地提高開發(fā)效率和代碼的可維護(hù)性。本文將介紹幾個在Java開發(fā)中非常實用的工具類,包括Objects、StringUtils、BeanUtils、ReflectionUtils、DigestUtils和HttpStatus。這些工具類涵蓋了從對象操作、字符串處理到數(shù)據(jù)加密和HTTP狀態(tài)碼的管理,幫助開發(fā)者簡化復(fù)雜的編程任務(wù)。
通過這些工具類的使用,開發(fā)者不僅能夠減少代碼量,還能夠提高代碼的可讀性和可復(fù)用性。接下來,我們將逐一探討每個工具類的關(guān)鍵方法及其應(yīng)用場景,帶你深入理解如何在日常開發(fā)中利用這些工具來提升工作效率。
今天,我決定與大家分享一些我常用的小工具,希望對你們有所幫助。
本文將分享9個在日常工作中必定會用到的小工具,主要內(nèi)容如下:
圖片
1. Collections
首先介紹的是java.util包下的Collections類。該類主要用于對集合進(jìn)行操作或返回集合。我個人非常喜歡使用它。以下是一些常用的功能:
1.1 排序
在工作中,常常需要對集合進(jìn)行排序。我們來看一下如何使用Collections工具實現(xiàn)升序和降序:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
Collections.sort(list); // ASC
System.out.println(list);
Collections.reverse(list); // DESC
System.out.println(list);
輸出:
[1, 2, 3]
[3, 2, 1]
1.2 獲取最大值或最小值
有時需要在集合中找到最大值或最小值。此時可以使用Collections的max和min方法。
例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
Integer max = Collections.max(list);
Integer min = Collections.min(list);
System.out.println(max);
System.out.println(min);
輸出:
3
1
1.3 返回空集合
有時在檢查空值后,我們需要返回一個空集合??梢允褂胑mptyList方法。例如:
private List<Integer> fun(List<Integer> list) {
if (list == null || list.size() == 0) {
return Collections.emptyList();
}
// ...
return list;
}
1.4 轉(zhuǎn)換為不可修改集合
為了防止后續(xù)程序修改某個集合的結(jié)果,有時需要將某個集合定義為不可修改。這可以通過Collections的unmodifiablexxx方法輕松實現(xiàn):
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> integers = Collections.unmodifiableList(list);
integers.add(4); // 這里會拋出異常
System.out.println(integers);
輸出:
圖片
1.5 轉(zhuǎn)換為線程安全集合
我們都知道,Java中的許多集合(如ArrayList、LinkedList、HashMap、HashSet等)都是非線程安全的。
換句話說,在多線程環(huán)境中,向這些集合添加數(shù)據(jù)會導(dǎo)致異常。
此時,可以使用Collections的synchronizedxxx方法直接將這些線程不安全的集合轉(zhuǎn)換為線程安全的集合。例如:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> integers = Collections.synchronizedList(list); // 將ArrayList轉(zhuǎn)換為線程安全集合
System.out.println(integers);
其底層實現(xiàn)會創(chuàng)建SynchronizedRandomAccessList或SynchronizedList類。這兩個類的許多方法會使用synchronized進(jìn)行鎖定。
當(dāng)然,Collections工具類中還有很多常用方法,這里不逐一介紹,大家可以自行探索。
圖片
2. CollectionUtils
對于集合操作,除了前面提到的Collections工具類,CollectionUtils工具類也非常常用。
目前,比較主流的有apache中的org.apache.commons.collections包下的CollectionUtils工具類。
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
它提供了許多方法。例如:
圖片
當(dāng)然,Spring框架中也有org.springframework.util包下的CollectionUtils工具類。
不過,我個人推薦使用apache包下的CollectionUtils工具類,因為它有更多更全面的工具。例如,Spring中的CollectionUtils沒有判斷集合是否非空的方法,而apache中的CollectionUtils就有。
接下來,我們將以apache中的CollectionUtils工具類為例,介紹一些常用的方法。
2.1 檢查集合是否為空
CollectionUtils工具類的isEmpty方法可以輕松判斷集合是否為空,isNotEmpty方法判斷集合是否非空。
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
if (CollectionUtils.isEmpty(list)) {
System.out.println("集合為空。");
}
if (CollectionUtils.isNotEmpty(list)) {
System.out.println("集合非空");
}
2.2 對兩個集合進(jìn)行操作
有時我們需要對兩個現(xiàn)有集合進(jìn)行操作,例如取交集或并集。
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);
// 獲取并集
Collection<Integer> unionList = CollectionUtils.union(list, list2);
System.out.println(unionList);
// 獲取交集
Collection<Integer> intersectionList = CollectionUtils.intersection(list, list2);
System.out.println(intersectionList);
// 獲取對稱差
Collection<Integer> disjunctionList = CollectionUtils.disjunction(list, list2);
System.out.println(disjunctionList);
// 獲取差集
Collection<Integer> subtractList = CollectionUtils.subtract(list, list2);
System.out.println(subtractList);
執(zhí)行結(jié)果:
[1, 2, 3, 4]
[2]
[1, 3, 4]
[1, 3]
對兩個集合的操作在實際工作中非常常見。但當(dāng)你想到某種操作時,可以先檢查是否有現(xiàn)成的工具,以避免浪費時間。一般來說,一些基本功能已經(jīng)實現(xiàn)。
3. Lists
如果你引入了com.google.guava的依賴,你會獲得許多有用的小工具。這里推薦一個位于com.google.common.collect包下的集合工具:Lists。
它非常實用,讓我愛不釋手。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
3.1 快速初始化集合
有時,我們想在集合中初始化一些元素。這時可以使用Lists的newArrayList方法。例如:
List<Integer> list = Lists.newArrayList(1, 2, 3);
這比直接創(chuàng)建一個列表后再一個個添加元素方便得多。
執(zhí)行結(jié)果:
[1, 2, 3]
3.2 笛卡爾積
如果你想對兩個集合執(zhí)行笛卡爾積,Lists的cartesianProduct方法可以幫助你實現(xiàn):
List<Integer> list1 = Lists.newArrayList(1, 2, 3);
List<Integer> list2 = Lists.newArrayList(4, 5);
List<List<Integer>> productList = Lists.cartesianProduct(list1, list2);
System.out.println(productList);
執(zhí)行結(jié)果:
[[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
3.3 拆分集合(分頁)
如果你想將一個大集合拆分成若干個小集合,可以使用Lists的partition方法:
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
List<List<Integer>> partitionList = Lists.partition(list, 2);
System.out.println(partitionList);
執(zhí)行結(jié)果:
[[1, 2], [3, 4], [5]]
在這個例子中,列表有5個數(shù)據(jù)。我將列表集合拆分成3頁,每頁大小為2,也就是變成了3個小集合。
這是我最喜歡的方法之一,常在項目中使用。
例如,有一個需求:現(xiàn)在有10,000個id,需要調(diào)用批量用戶查詢接口來獲取用戶數(shù)據(jù)。但是如果直接查詢10,000個用戶,單個接口的響應(yīng)時間可能會非常慢。
如果改為批量處理,每次只查詢500個用戶,異步調(diào)用20次,就不會出現(xiàn)單個接口響應(yīng)慢的問題。
3.4 流處理
如果我們想將某個集合轉(zhuǎn)換為另一個接口,可以使用Lists的transform方法。例如:
List<String> list = Lists.newArrayList("a","b","c");
List<String> transformList = Lists.transform(list, x -> x.toUpperCase());
System.out.println(transformList);
小寫字母被轉(zhuǎn)換為大寫字母。
[A, B, C]
3.5 反轉(zhuǎn)順序
Lists提供了一個reverse()方法用于反轉(zhuǎn)順序。例如:
List<Integer> list = Lists.newArrayList(3, 1, 2, 5, 4);
List<Integer> reverseList = Lists.reverse(list);
System.out.println(reverseList);
執(zhí)行結(jié)果:
[4, 5, 2, 1, 3]
當(dāng)然,Lists還有其他有用的工具。我這里只展示了一些例子,有興趣的朋友可以深入研究。
圖片
4. Objects
在jdk7之后,提供了Objects工具類,我們可以通過它對對象進(jìn)行操作。
4.1 檢查對象是否為null
在Java中,一切都是對象。檢查對象是否為null可以說是無處不在。Objects的isNull方法用于檢查對象是否為null,而nonNull方法用于檢查對象是否不為null。例如:
Integer i = new Integer(10);
if (Objects.isNull(i)) {
System.out.println("對象為null");
}
if (Objects.nonNull(i)) {
System.out.println("對象不為null");
}
4.2 當(dāng)對象為null時拋出異常
如果我們想在對象為null時拋出空指針異常,可以使用Objects的requireNonNull方法。例如:
Integer i = new Integer(128);
Objects.requireNonNull(i);
Objects.requireNonNull(i, "參數(shù)不能為空");
Objects.requireNonNull(i, () -> "參數(shù)不能為空");
4.3 檢查兩個對象是否相等
我們經(jīng)常需要檢查兩個對象是否相等。Objects為我們提供了equals方法,可以非常方便地實現(xiàn):
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(Objects.equals(i1, i2));
執(zhí)行結(jié)果:
true
但在使用這個方法時有一個坑。例如,如果將例子改為:
Integer i = new Integer(1);
Long l = new Long(1);
System.out.println(Objects.equals(i, l));
執(zhí)行結(jié)果:
false
你知道為什么輸出false嗎?可以在評論區(qū)交流。
4.4 獲取對象的hashCode
如果你想獲取某個對象的hashCode,可以使用Objects的hashCode方法。例如:
String str = new String("abc");
System.out.println(Objects.hashCode(str));
執(zhí)行結(jié)果:
96354
關(guān)于Objects的內(nèi)容介紹到此為止。有興趣的朋友可以查看下面更多的方法。
圖片
5. StringUtils
字符串在我們的日常工作中使用得非常頻繁。
在我們的代碼中,我們常常需要檢查字符串是否為null、轉(zhuǎn)換大小寫、拆分字符串、比較字符串、去除多余空格、連接字符串、使用正則表達(dá)式等等。
如果我們只使用String類提供的方法,就需要手動寫大量的額外代碼,這樣既耗時又費力。
作為程序員,當(dāng)然需要學(xué)會懶惰 ??。現(xiàn)在有一個現(xiàn)成的工具類,org.apache.commons.lang3包下的StringUtils工具類,為我們提供了非常豐富的選擇。
5.1 檢查字符串是否為null
實際上,對于一個空字符串,不僅有null,還有""、" "、"null",以及許多其他情況。
StringUtils為我們提供了多個靜態(tài)方法來檢查字符串是否為null。例如:
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = "abc";
System.out.println(StringUtils.isEmpty(str1));
System.out.println(StringUtils.isEmpty(str2));
System.out.println(StringUtils.isEmpty(str3));
System.out.println(StringUtils.isEmpty(str4));
System.out.println("-------------------------------------");
System.out.println(StringUtils.isNotEmpty(str1));
System.out.println(StringUtils.isNotEmpty(str2));
System.out.println(StringUtils.isNotEmpty(str3));
System.out.println(StringUtils.isNotEmpty(str4));
System.out.println("-------------------------------------");
System.out.println(StringUtils.isBlank(str1));
System.out.println(StringUtils.isBlank(str2));
System.out.println(StringUtils.isBlank(str3));
System.out.println(StringUtils.isBlank(str4));
System.out.println("-------------------------------------");
System.out.println(StringUtils.isNotBlank(str1));
System.out.println(StringUtils.isNotBlank(str2));
System.out.println(StringUtils.isNotBlank(str3));
System.out.println(StringUtils.isNotBlank(str4));
輸出:
true
true
false
false
-------------------------------------
false
false
true
true
-------------------------------------
true
true
true
false
-------------------------------------
false
false
false
true
示例中的四個null檢查方法:isEmpty、isNotEmpty、isBlank和isNotBlank??梢愿鶕?jù)實際情況使用這些方法。
建議優(yōu)先使用 *isBlank* 和*isNotBlank* 方法,因為它們也會考慮到 *" "* 的情況。
5.2 拆分字符串
拆分字符串是一個常見需求。如果你直接使用String類的split方法,可能會出現(xiàn)空指針異常。
String str1 = null;
System.out.println(StringUtils.split(str1, ","));
System.out.println(str1.split(","));
輸出:
圖片
使用StringUtils的split方法會返回null,而使用String的split方法則會報指針異常。
5.3 檢查是否為純數(shù)字
給定一個字符串,檢查它是否為純數(shù)字,可以使用isNumeric方法。例如:
String str1 = "123";
String str2 = "123abc";
String str3 = "0.33";
System.out.println(StringUtils.isNumeric(str1));
System.out.println(StringUtils.isNumeric(str2));
System.out.println(StringUtils.isNumeric(str3));
輸出:
true
false
false
5.4 將集合連接成字符串
有時,我們需要將集合的內(nèi)容連接成一個字符串,然后輸出。這時可以使用join方法。例如:
List<String> list = Lists.newArrayList("a", "b", "c");
List<Integer> list2 = Lists.newArrayList(1, 2, 3);
System.out.println(StringUtils.join(list, ","));
System.out.println(StringUtils.join(list2, " "));
輸出:
a,b,c
1 2 3
當(dāng)然,還有許多實用方法。我不會在這里一一介紹。
6. BeanUtils
Spring為我們提供了一個用于JavaBean的工具類,位于org.springframework.beans包下。它的名字是:BeanUtils。
讓我們看看這個工具能給我們帶來什么驚喜。
6.1 復(fù)制對象屬性
你是否遇到過這樣的需求:將某個對象的所有屬性復(fù)制到另一個對象中。這個時候,可以使用BeanUtils的copyProperties方法。例如:
User user1 = new User();
user1.setId(1L);
user1.setName("Dylan");
user1.setAddress("香港");
User user2 = new User();
BeanUtils.copyProperties(user1, user2);
System.out.println(user2);
6.2 獲取指定類的指定方法
如果你想獲取某個類的指定方法以便后續(xù)操作,可以使用BeanUtils的findDeclaredMethod方法。例如:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
System.out.println(declaredMethod.getName());
6.3 獲取指定方法的參數(shù)
如果你想獲取某個方法的參數(shù),可以使用BeanUtils的findPropertyForMethod方法。例如:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
System.out.println(propertyForMethod.getName());
如果你對BeanUtils感興趣,可以看看以下內(nèi)容:
7. ReflectionUtils
有時,我們需要在項目中使用reflection功能。如果我們使用最原始的方法開發(fā),代碼量會非常大,且麻煩。需要處理大量的異常和訪問權(quán)限問題。
好消息是,Spring為我們提供了一個ReflectionUtils工具類,位于org.springframework.util包下。
7.1 獲取方法
如果你想獲取某個類的某個方法,可以使用ReflectionUtils類的findMethod方法。例如:
Method method = ReflectionUtils.findMethod(User.class, "getId");
7.2 獲取字段
如果你想獲取某個類的某個字段,可以使用ReflectionUtils類的findField方法。例如:
Field field = ReflectionUtils.findField(User.class, "id");
7.3 執(zhí)行方法
如果你想通過反射調(diào)用某個方法并傳遞參數(shù),可以使用ReflectionUtils類的invokeMethod方法。例如:
ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);
7.4 檢查字段是否為常量
如果你想檢查一個字段是否為常量,可以使用ReflectionUtils類的isPublicStaticFinal方法。例如:
Field field = ReflectionUtils.findField(User.class, "id");
System.out.println(ReflectionUtils.isPublicStaticFinal(field));
7.5 檢查是否為equals方法
如果你想檢查某個方法是否為equals方法,可以使用ReflectionUtils類的isEqualsMethod方法。例如:
Method method = ReflectionUtils.findMethod(User.class, "getId");
System.out.println(ReflectionUtils.isEqualsMethod(method));
當(dāng)然,這個類還有許多有趣的方法。有興趣的朋友可以點擊進(jìn)入這個類自行查看。
圖片
8. DigestUtils
有時,我們需要對數(shù)據(jù)進(jìn)行加密,例如使用md5或sha256。
我們可以使用Apache的org.apache.commons.codec.digest包下的DigestUtils類。
8.1 MD5加密
如果你想使用MD5加密數(shù)據(jù),可以使用DigestUtils的md5Hex方法。例如:
String md5Hex = DigestUtils.md5Hex("Dylan");
System.out.println(md5Hex);
8.2 SHA256加密
如果你想使用SHA256加密數(shù)據(jù),可以使用DigestUtils的sha256Hex方法。例如:
String sha256Hex = DigestUtils.sha256Hex("Dylan");
System.out.println(sha256Hex);
當(dāng)然,這個工具還有許多其他加密方法:
圖片
9. HttpStatus
很多時候,我們會在代碼中定義HTTP返回代碼。例如,正常接口返回200,異常返回500,如果接口找不到,則返回404。
private int SUCCESS_CODE = 200;
private int ERROR_CODE = 500;
private int NOT_FOUND_CODE = 404;
實際上,org.springframework.http包下的HttpStatus枚舉或org.apache.http包下的HttpStatus接口已經(jīng)為我們定義了常用的HTTP返回代碼。我們可以直接使用它們,確實不需要重新定義。
圖片
結(jié)論
在本篇文章中,我們深入探討了多個實用的Java工具類,展示了如何利用這些類來簡化編程工作。無論是通過Objects來進(jìn)行對象的檢查與操作,還是使用StringUtils進(jìn)行字符串的處理,抑或是借助BeanUtils與ReflectionUtils進(jìn)行對象屬性的復(fù)制和反射操作,這些工具類都為我們提供了強大的支持。此外,DigestUtils則讓數(shù)據(jù)加密變得簡單高效,而HttpStatus則幫助我們規(guī)范HTTP響應(yīng)碼的使用。
掌握這些工具類的使用,不僅可以提升開發(fā)效率,還能減少潛在的錯誤,使代碼更加簡潔和易于維護(hù)。在今后的開發(fā)實踐中,希望讀者能夠充分利用這些工具,提升自己的編程技能,寫出更加高質(zhì)量的代碼。歡迎大家探索更多的Java工具類,進(jìn)一步增強你的開發(fā)能力。