Java必學的工具庫,讓你的代碼量減少90%
來源:toutiao.com/
i6943239541448917512
1. Java自帶工具方法 2. apache commons工具類庫 2.1 commons-lang,java.lang的增強版 2.2 commons-collections 集合工具類 2.3 common-beanutils 操作對象 2.4 commons-io 文件流處理 3. Google Guava 工具類庫
工作很多年后,才發(fā)現(xiàn)有很多工具類庫,可以大大簡化代碼量,提升開發(fā)效率,初級開發(fā)者卻不知道。而這些類庫早就成為了業(yè)界標準類庫,大公司的內(nèi)部也都在使用,如果剛工作的時候就有人告訴我使用這些工具類庫,該多好!
一塊看一下有哪些工具類庫你也用過。
1. Java自帶工具方法
1.1 List集合拼接成以逗號分隔的字符串
//?如何把list集合拼接成以逗號分隔的字符串?a,b,c
List?list?=?Arrays.asList("a",?"b",?"c");
//?第一種方法,可以用stream流
String?join?=?list.stream().collect(Collectors.joining(","));
System.out.println(join);?//?輸出?a,b,c
//?第二種方法,其實String也有join方法可以實現(xiàn)這個功能
String?join?=?String.join(",",?list);
System.out.println(join);?//?輸出?a,b,c
1.2 比較兩個字符串是否相等,忽略大小寫
if?(strA.equalsIgnoreCase(strB))?{
??System.out.println("相等");
}
1.3 比較兩個對象是否相等
當我們用equals比較兩個對象是否相等的時候,還需要對左邊的對象進行判空,不然可能會報空指針異常,我們可以用java.util包下Objects封裝好的比較是否相等的方法
Objects.equals(strA,?strB);
源碼是這樣的
public?static?boolean?equals(Object?a,?Object?b)?{
????return?(a?==?b)?||?(a?!=?null?&&?a.equals(b));
}
1.4 兩個List集合取交集
List?list1?=?new?ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List?list2?=?new?ArrayList<>();
list2.add("a");
list2.add("b");
list2.add("d");
list1.retainAll(list2);
System.out.println(list1);?//?輸出[a,?b]
推薦下自己做的 Spring Boot 的實戰(zhàn)項目:
https://github.com/YunaiV/ruoyi-vue-pro
2. apache commons工具類庫
apache commons是最強大的,也是使用最廣泛的工具類庫,里面的子庫非常多,下面介紹幾個最常用的
2.1 commons-lang,java.lang的增強版
建議使用commons-lang3,優(yōu)化了一些api,原來的commons-lang已停止更新
Maven依賴是:
<dependency>
????<groupId>org.apache.commonsgroupId>
????<artifactId>commons-lang3artifactId>
????<version>3.12.0version>
dependency>
2.1.1 字符串判空
傳參CharSequence類型是String、StringBuilder、StringBuffer的父類,都可以直接下面方法判空,以下是源碼:
public?static?boolean?isEmpty(final?CharSequence?cs)?{
????return?cs?==?null?||?cs.length()?==?0;
}
public?static?boolean?isNotEmpty(final?CharSequence?cs)?{
????return?!isEmpty(cs);
}
//?判空的時候,會去除字符串中的空白字符,比如空格、換行、制表符
public?static?boolean?isBlank(final?CharSequence?cs)?{
????final?int?strLen?=?length(cs);
????if?(strLen?==?0)?{
????????return?true;
????}
????for?(int?i?=?0;?i?????????if?(!Character.isWhitespace(cs.charAt(i)))?{
????????????return?false;
????????}
????}
????return?true;
}
public?static?boolean?isNotBlank(final?CharSequence?cs)?{
????return?!isBlank(cs);
}
2.1.2 首字母轉(zhuǎn)成大寫
String?str?=?"yideng";
String?capitalize?=?StringUtils.capitalize(str);
System.out.println(capitalize);?//?輸出Yideng
2.1.3 重復拼接字符串
String?str?=?StringUtils.repeat("ab",?2);
System.out.println(str);?//?輸出abab
2.1.4 格式化日期
再也不用手寫SimpleDateFormat格式化了
//?Date類型轉(zhuǎn)String類型
String?date?=?DateFormatUtils.format(new?Date(),?"yyyy-MM-dd?HH:mm:ss");
System.out.println(date);?//?輸出?2021-05-01?01:01:01
//?String類型轉(zhuǎn)Date類型
Date?date?=?DateUtils.parseDate("2021-05-01?01:01:01",?"yyyy-MM-dd?HH:mm:ss");
//?計算一個小時后的日期
Date?date?=?DateUtils.addHours(new?Date(),?1);
2.1.5 包裝臨時對象
當一個方法需要返回兩個及以上字段時,我們一般會封裝成一個臨時對象返回,現(xiàn)在有了Pair和Triple就不需要了
//?返回兩個字段
ImmutablePair?pair?=?ImmutablePair.of(1,?"yideng");
System.out.println(pair.getLeft()?+?","?+?pair.getRight());?//?輸出?1,yideng
//?返回三個字段
ImmutableTriple?triple?=?ImmutableTriple.of(1,?"yideng",?new?Date());
System.out.println(triple.getLeft()?+?","?+?triple.getMiddle()?+?","?+?triple.getRight());?//?輸出?1,yideng,Wed?Apr?07?23:30:00?CST?2021
2.2 commons-collections 集合工具類
Maven依賴是:
<dependency>
????<groupId>org.apache.commonsgroupId>
????<artifactId>commons-collections4artifactId>
????<version>4.4version>
dependency>
2.2.1 集合判空
封裝了集合判空的方法,以下是源碼:
public?static?boolean?isEmpty(final?Collection>?coll)?{
????return?coll?==?null?||?coll.isEmpty();
}
public?static?boolean?isNotEmpty(final?Collection>?coll)?{
????return?!isEmpty(coll);
}
//?兩個集合取交集
Collection?collection?=?CollectionUtils.retainAll(listA,?listB);
//?兩個集合取并集
Collection?collection?=?CollectionUtils.union(listA,?listB);
//?兩個集合取差集
Collection?collection?=?CollectionUtils.subtract(listA,?listB);
2.3 common-beanutils 操作對象
Maven依賴:
<dependency>
????<groupId>commons-beanutilsgroupId>
????<artifactId>commons-beanutilsartifactId>
????<version>1.9.4version>
dependency>
????????public?class?User?{
????????private?Integer?id;
????????private?String?name;
????????}
設置對象屬性
User?user?=?new?User();
BeanUtils.setProperty(user,?"id",?1);
BeanUtils.setProperty(user,?"name",?"yideng");
System.out.println(BeanUtils.getProperty(user,?"name"));?//?輸出?yideng
System.out.println(user);?//?輸出?{"id":1,"name":"yideng"}
對象和map互轉(zhuǎn)
//?對象轉(zhuǎn)map
Map?map?=?BeanUtils.describe(user);
System.out.println(map);?//?輸出?{"id":"1","name":"yideng"}
//?map轉(zhuǎn)對象
User?newUser?=?new?User();
BeanUtils.populate(newUser,?map);
System.out.println(newUser);?//?輸出?{"id":1,"name":"yideng"}
2.4 commons-io 文件流處理
Maven依賴:
<dependency>
????<groupId>commons-iogroupId>
????<artifactId>commons-ioartifactId>
????<version>2.8.0version>
dependency>
文件處理
File?file?=?new?File("demo1.txt");
//?讀取文件
List?lines?=?FileUtils.readLines(file,?Charset.defaultCharset());
//?寫入文件
FileUtils.writeLines(new?File("demo2.txt"),?lines);
//?復制文件
FileUtils.copyFile(srcFile,?destFile);
推薦下自己做的 Spring Cloud 的實戰(zhàn)項目:
https://github.com/YunaiV/onemall
3. Google Guava 工具類庫
Maven依賴:
<dependency>
????<groupId>com.google.guavagroupId>
????<artifactId>guavaartifactId>
????<version>30.1.1-jreversion>
dependency>
3.1 創(chuàng)建集合
List?list?=?Lists.newArrayList();
List?list?=?Lists.newArrayList(1,?2,?3);
//?反轉(zhuǎn)list
List?reverse?=?Lists.reverse(list);
System.out.println(reverse);?//?輸出?[3,?2,?1]
//?list集合元素太多,可以分成若干個集合,每個集合10個元素
List>?partition?=?Lists.partition(list,?10);
Map?map?=?Maps.newHashMap();
Set?set?=?Sets.newHashSet();
3.2 黑科技集合
3.2.1 Multimap 一個key可以映射多個value的HashMap
Multimap?map?=?ArrayListMultimap.create();
map.put("key",?1);
map.put("key",?2);
Collection?values?=?map.get("key");
System.out.println(map);?//?輸出?{"key":[1,2]}
//?還能返回你以前使用的臃腫的Map
Map>?collectionMap?=?map.asMap();
多省事,多簡潔,省得你再創(chuàng)建 Map
3.2.2 BiMap 一種連value也不能重復的HashMap
BiMap?biMap?=?HashBiMap.create();
//?如果value重復,put方法會拋異常,除非用forcePut方法
biMap.put("key","value");
System.out.println(biMap);?//?輸出?{"key":"value"}
//?既然value不能重復,何不實現(xiàn)個翻轉(zhuǎn)key/value的方法,已經(jīng)有了
BiMap?inverse?=?biMap.inverse();
System.out.println(inverse);?//?輸出?{"value":"key"}
這其實是雙向映射,在某些場景還是很實用的。
3.2.3 Table 一種有兩個key的HashMap
//?一批用戶,同時按年齡和性別分組
Table?table?=?HashBasedTable.create();
table.put(18,?"男",?"yideng");
table.put(18,?"女",?"Lily");
System.out.println(table.get(18,?"男"));?//?輸出?yideng
//?這其實是一個二維的Map,可以查看行數(shù)據(jù)
Map?row?=?table.row(18);
System.out.println(row);?//?輸出?{"男":"yideng","女":"Lily"}
//?查看列數(shù)據(jù)
Map?column?=?table.column("男");
System.out.println(column);?//?輸出?{18:"yideng"}
3.2.4 Multiset 一種用來計數(shù)的Set
Multiset?multiset?=?HashMultiset.create();
multiset.add("apple");
multiset.add("apple");
multiset.add("orange");
System.out.println(multiset.count("apple"));?//?輸出?2
//?查看去重的元素
Set?set?=?multiset.elementSet();
System.out.println(set);?//?輸出?["orange","apple"]
//?還能查看沒有去重的元素
Iterator?iterator?=?multiset.iterator();
while?(iterator.hasNext())?{
????System.out.println(iterator.next());
}
//?還能手動設置某個元素出現(xiàn)的次數(shù)
multiset.setCount("apple",?5);
以上為個人經(jīng)驗,希望能給大家一個參考,如有錯誤或未考慮完全的地方,望不吝賜教。
歡迎加入我的知識星球,一起探討架構(gòu),交流源碼。加入方式,長按下方二維碼噢:
已在知識星球更新源碼解析如下:
最近更新《芋道 SpringBoot 2.X 入門》系列,已經(jīng) 101 余篇,覆蓋了?MyBatis、Redis、MongoDB、ES、分庫分表、讀寫分離、SpringMVC、Webflux、權(quán)限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能測試等等內(nèi)容。
提供近 3W 行代碼的 SpringBoot 示例,以及超 4W 行代碼的電商微服務項目。
獲取方式:點“在看”,關(guān)注公眾號并回復?666?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)





