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工具類提供了很多過載的形式,適合不同的場景使用
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都提供了對集合的簡易操作,根據喜歡選其一就好
還得看業務場景的需要啊,有得用就用(穩定性得考慮好),沒必要自己重複造輪子,造一大堆輪子,效率還可能沒別人的好,既浪費時間也浪費精力,當然你說我就想自己造一個,那當然可以,這裡也只是提出一個建議而已