介紹幾個好用的工具類

碼農Amg發表於2022-01-09

The end is also the new beginning

最近真的是忙的飛起啊!!年前還得更新一個版本,啊難受啊...趁今天有空,上來冒個泡?

好,入正題,今天介紹幾個非常實用的工具類,可以減少我們重複造輪子,專注於具體的業務編寫,提升生產效率,如果你還沒有使用過這些工具類,強烈推薦去使用一下,你會發現程式碼清爽很多

1.apache-commons-lang3

相信大家在寫程式碼的時候都會遇到,需要對字串進行各種操作,例如判斷是否為空,判斷字串是否全大/小寫,是否包含某個字串,是否以某個字首開始/字尾結束,等等等等

由於String字串提供的操作是有限的,不妨使用一下這個工具類感受一下

<!-- 引入依賴 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

1.1 判斷字串是否為空

import org.apache.commons.lang3.StringUtils;
/**
* 判斷字串是否為空,【common--lang3】
* @param str	傳入字串
* @return		是否為空boolean值
*/
private static boolean commonlang3IsEmpty(String str) {
    return StringUtils.isEmpty(str);
}


//原始碼其實就是
return cs == null || cs.length() == 0;


1.2 判斷字串是否為空(空字元也算空)

import org.apache.commons.lang3.StringUtils;

//isBlank跟isEmpty的區別就在於,如果字串是由一串空格組成的,isEmpty會返回false,isBlank會返回true
private static boolean commonlang3IsBlank(String str) {
	return StringUtils.isBlank(str);
}

//原始碼註釋寫的很清楚,這個方法會比isEmpty更加的嚴謹

1.3 同時判斷多個字串是否都為Empty,或者Blank

StringUtils.isAllEmpty(CharSequence... css);
StringUtils.isAllBlank(CharSequence... css);

1.4 判斷字串是否全大/小寫

private static boolean isAllUpperCase(String str) {
    //判斷小寫,把Upper換成lower即可
	return StringUtils.isAllUpperCase(str);
}

//這個就很常用了,String中是沒有這個方法的,就得使用Character.isUpperCase來一個一個字元的判斷,屬於重複造輪子

1.5 判斷指定字串是否以某個字首開頭(可以忽略大小寫)

private static boolean isStartWithPrefix(String str, String prefix) {
    //忽略大小寫 StringUtils.startsWithIgnoreCase(str, prefix);
    return StringUtils.startsWith(str, prefix);
}

//相似的,字尾suffix也是差不多的api StringUtils.endWith(String str,String suffix)

當然,commons中其實還有很多很有用的工具類,不僅僅只針對字串方面的,我是使用StringUtils比較多,所以就拿它作為講解,commons具體還有那些個方面的工具類,就由待你自己去發掘啦,比如時間格式化工具類、執行緒工具類、併發工具類等等

2.apache-commons-collections4

從包名應該就猜得出來,這是對集合進行操作的工具類,挑幾個常用的方法來介紹一下

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

2.1 判斷集合是否為空

private static boolean isCollectionEmpty(Collection collection) {
    return CollectionUtils.isEmpty(collection);
}

//注意接收的是Collection介面,所以所有實現了Collection的類都可以傳入判斷

2.2 返回兩個集合的交/並集

這個是很常用的,某些場景我們需要對兩個集合中的值進行操作,返回一個新的集合

//union -> 並集
private static Collection<Integer> getUnion(Collection<Integer> cola,Collection<Integer> colb) {
    return CollectionUtils.union(cola, colb);
}

//構造兩個list
List<Integer> listA = Arrays.asList(1 ,2 ,3 ,4 ,5);
List<Integer> listB = Arrays.asList(4,5,6,7);

//呼叫方法後的結果是
[1, 2, 3, 4, 5, 6, 7]

//intersection -> 交集
private static Collection<Integer> getIntersection(Collection<Integer> cola,Collection<Integer> colb) {
    return CollectionUtils.intersection(cola, colb);
}

//同樣還是上述兩個list,操作之後
[4, 5]

2.3 過濾集合中不符合條件的元素

//第一個引數接收一個集合
//第二個引數是一個謂詞判斷條件,如果不為真就從集合中移除,這裡就是想返回一個偶數列表
private static boolean filter(Collection<Integer> collection) {
    return CollectionUtils.filter(collection,
                                  object -> object % 2 != 1);
}

//list 【0,1 ,2 ,3 ,4 ,5,6,7,8,9,10】

//呼叫方法後返回
[0, 2, 4, 6, 8, 10]

2.4 針對Map的MapUtils

2.4.1 判斷Map是否為空

private static boolean isMapEmpty(Map<?,?> map) {
   return MapUtils.isEmpty(map);
}

2.4.2 將Map的Value轉換成對應的型別值

這裡以getLongValue來做一個介紹

//可以注意到此時Map的key是String型別的,value也是String型別的,我們要把value轉換成Long並且返回
private static Long getLongValue(Map<String,String> map) {
    return MapUtils.getLongValue(map, "key1");
}

Map<String,String> map = new HashMap<>();
map.put("key1", "12345");

Long longValue = getLongValue(map);
System.out.println(longValue);

//結果是longValue = 12345L

//如果傳入String不是能轉成Long型別的字串,就會返回0,也可以通過過載方法,指定一個default值


MapUtils工具類提供了很多過載的形式,適合不同的場景使用

image-20220109165832157

2.4.3 將陣列中的元素放到Map中

private static Map<?,?>	putAll(Map<?,?> map, Object[] array) {
    return MapUtils.putAll(map, array);
}
//如果傳入的是一個二維陣列
String[][] twoDimensionalArray = new String[][] {
    {"key1","value1"},
    {"key2","value2"},
    {"key3","value3"},
};

Map<?, ?> map = putAll(new HashMap<>() ,twoDimensionalArray);
System.out.println(map);

結果:{key1=value1, key2=value2, key3=value3}

//如果傳入的是一個一維陣列

String[] array = new String[] {
    "key1","value1","key2","value2","key3","value3"
};

Map<?, ?> map = putAll(new HashMap<>() ,array);
System.out.println(map);

結果:{key1=value1, key2=value2, key3=value3}, 如果傳入的陣列是有問題的,就會把對應的key-value拋棄
    也就是說,如果陣列沒有給出 "value3"這個元素,對應的key3就不會被新增到Map中

//如果傳入的是Map.Entry
Map.Entry[] entries = new Map.Entry[] {
    new DefaultMapEntry("key1","value1"),
    new DefaultMapEntry("key2","value2"),
    new DefaultMapEntry("key3","value3")
};


Map<?, ?> map = putAll(new HashMap<>() ,entries);
System.out.println(map);

結果:{key1=value1, key2=value2, key3=value3}

collection4這個包就介紹這麼多,大家也可以去看下這個包還提供那些工具類,例如針對Set的、Queue的等等都有

3.Hutool工具類包

官網:點選開啟

官方介紹:

Hutool是一個小而全的Java工具類庫,通過靜態方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函式式語言般的優雅,讓Java語言也可以“甜甜的”。

Hutool中的工具方法來自每個使用者的精雕細琢,它涵蓋了Java開發底層程式碼中的方方面面,它既是大型專案開發中解決小問題的利器,也是小型專案中的效率擔當;

簡而言之,裡邊包含了我們日常開發中的會應用到工具類的各個場景,例如

  • 時間的轉換工具
  • 生成全域性唯一id
  • 檔案流的操作
  • 日誌操作
  • .....

具體的使用例子,直接看官方文件即可

總結

其實還是有很多其他很有用的工具類的,例如Google guava,上面沒列出來的原因是(主要是懶了,有興趣的去查查資料即可),找到適合使用的,足夠穩定的,效能又可以的,就可以了,commons-collection4和guava都提供了對集合的簡易操作,根據喜歡選其一就好

還得看業務場景的需要啊,有得用就用(穩定性得考慮好),沒必要自己重複造輪子,造一大堆輪子,效率還可能沒別人的好,既浪費時間也浪費精力,當然你說我就想自己造一個,那當然可以,這裡也只是提出一個建議而已

相關文章