來(lái)自專(zhuān)輯 工具推薦
古時(shí)的風(fēng)箏第 74 篇原創(chuàng)文章
風(fēng)箏我作為一個(gè)野路子開(kāi)發(fā)者,直到遇見(jiàn)下面的這幾個(gè)工具庫(kù),才知道之前重復(fù)造了不少輪子,而且輪子還不一定有人家的圓。相信跟我一樣,沒(méi)事兒造輪子的人還不在少數(shù),有些人就是對(duì)造輪子感興趣,這個(gè)咱也無(wú)話可說(shuō),但是,比如我,我是造輪子之前不知道這世上已經(jīng)有好用的輪子了,害,無(wú)知限制了我的想象力。 比如我們?cè)谀玫揭粋€(gè) List 集合之后,要對(duì)這個(gè)集合進(jìn)行判空操作,以前我一直是這樣寫(xiě)的:
List<String> list = getList();
if (list != null && list.size() > 0) {
//do something
}
雖然這樣也沒(méi)什么問(wèn)題,但是,我懶啊,每次敲這么多代碼,也挺累啊。有同學(xué)說(shuō),那你包裝成一個(gè)方法不就行了,每次調(diào)用個(gè)方法就 OK 啦。這不,同學(xué),你就在造輪子了,已經(jīng)有人幫你寫(xiě)好了這樣類(lèi)似的一系列方法了。 來(lái)讓我們認(rèn)識(shí)認(rèn)識(shí)這些輪子吧。
Java 8 Stream
Stream 不算是工具庫(kù),但是通過(guò) stream 提供的一系列方法,可以實(shí)現(xiàn)集合的過(guò)濾、分組、集合轉(zhuǎn)換等諸多操作。 例如下面的方法,實(shí)現(xiàn)列表元素根據(jù)某個(gè)字段去重的功能。
List<User> userList = new ArrayList();
//添加元素
userList = userList.stream().filter(distinctByKey(user->user.getUserId())).collect(Collectors.toList());
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
apache commons
官方地址:http://commons./ 這不是一個(gè)庫(kù),而是一系列的工具庫(kù)。 由于包含的庫(kù)過(guò)多,我就不一一列舉了,可以到官網(wǎng)一探。有集合處理的、數(shù)學(xué)計(jì)算的、IO 操作的等等,其中最常用的莫過(guò)于 Apache Commons Lang 和 Apache Commons Collections 這兩個(gè)。 Apache Commons Lang 包括一系列工具類(lèi),有字符串相關(guān)的、時(shí)間處理的、反射的、并發(fā)包的等等,Apache Commons Collections 專(zhuān)門(mén)用作集合處理。 下面舉幾個(gè)例子說(shuō)明一下,更詳細(xì)的內(nèi)容可以到官網(wǎng)查看文檔。
字符串判空操作
String s = "";
Boolean isEmpty = StringUtils.isEmpty(s);
獲取類(lèi)的全名稱(chēng)
ClassUtils.getName(ClassUtils.class);
判斷集合是否為空
Boolean isNotEmpty = CollectionUtils.isNotEmpty(list);
反射獲取某個(gè)類(lèi)的所有 Field
Field[] fields = FieldUtils.getAllFields(User.class);
Google Guava
官方地址:https://github.com/google/guava 和 Apache Commons 有點(diǎn)兒類(lèi)似,它也是包含了一系列的比如字符串、集合、反射、數(shù)學(xué)計(jì)算等的操作封裝,還可以用作 JVM 緩存。 舉幾個(gè)例子說(shuō)明: New 各種對(duì)象
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String,Object> map = Maps.newConcurrentMap();
// 不可變集合
ImmutableList<String> immutableList = ImmutableList.of("1", "2", "3");
列表轉(zhuǎn)符號(hào)分隔的字符串
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String result = Joiner.on("-").join(list);
> 1-2-3
求交集、并集、差集等 例如下面代碼求 set1 和 set2 的交集
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6);
Set<Integer> set2 = Sets.newHashSet(1,2,3,4);
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
Joda Time
官方地址:https://www./joda-time/ 一個(gè)日期、時(shí)間處理的工具庫(kù)。如果你不是經(jīng)常做日期處理,那差不多每次需要的時(shí)候都需要查詢(xún)相關(guān)的 API,而有了工具類(lèi)就不一樣了,只要一個(gè) “.”,你想要的方法就出現(xiàn)了,而 Joda Time 就是一款好用的工具庫(kù)。 比如下面這個(gè)方法,計(jì)算到新年還有多少天。
public Days daysToNewYear(LocalDate fromDate) {
LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
return Days.daysBetween(fromDate, newYear);
}
OkHttp3
官方地址:https://square./okhttp/ 一個(gè) HTTP 客戶(hù)端,使用簡(jiǎn)單,性能良好,是時(shí)候放棄 HttpClient 了。 一個(gè) get 請(qǐng)求:
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
一個(gè) post 請(qǐng)求:
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
Json 系列
Jackson
Spring 默認(rèn)的 Json 序列化工具,其實(shí)已經(jīng)足夠用了。 Gson Google 出品,功能齊全。 FastJson 阿里出品,算法良好,性能最優(yōu)。
EasyExcel
官方地址:https://www./easyexcel/doc/easyexcel 阿里開(kāi)源的 Excel 操作工具庫(kù),可以看做是 Apache POI 的增強(qiáng)封裝版、優(yōu)化版。 如果你的數(shù)據(jù)量很大,那用 EasyExcel 可以節(jié)省內(nèi)存,提升效率,并且沒(méi)有并發(fā)風(fēng)險(xiǎn)。 如果你的 Excel 足夠復(fù)雜,那用 EasyExcel 會(huì)比你直接用 POI 少些很多代碼。 比如我實(shí)現(xiàn)了下面這個(gè) Excel 動(dòng)態(tài)導(dǎo)出,包括動(dòng)態(tài)表頭、動(dòng)態(tài)合并單元格的功能,只用了很少的代碼,如果是使用 POI 的話,那可能代碼量增加不止一倍啊。
excel TinyPinyin
官方地址:https://github.com/promeG/TinyPinyin 中文轉(zhuǎn)拼音,把你輸入的中文轉(zhuǎn)換成拼音。比如搜索功能要實(shí)現(xiàn)這樣的功能,輸入 “fengzheng” 搜索,會(huì)匹配到 “風(fēng)箏”這個(gè)詞語(yǔ),這就需要中文轉(zhuǎn)拼音了。
有的同學(xué)說(shuō)了,這不是拼音轉(zhuǎn)英文嗎?當(dāng)然不是在輸入“fengzheng”的時(shí)候轉(zhuǎn)換了,而是在包含“風(fēng)箏”的這條記錄中有一個(gè)拼音的額外字段,這樣搜索的時(shí)候直接匹配拼音那個(gè)字段。 chinese_name pinyin_name 風(fēng)箏 fengzheng
反射工具庫(kù) - jOOR
官方地址:https://github.com/jOOQ/jOOR
它是 JDK 反射包的友好封裝,通過(guò)一系列簡(jiǎn)單友好的鏈?zhǔn)讲僮鲗?shí)現(xiàn)反射調(diào)用。比如下面這個(gè)例子
public interface StringProxy {
String substring(int beginIndex);
}
String substring = on("java.lang.String")
.create("Hello World")
.as(StringProxy.class)
.substring(6);
簡(jiǎn)單的代碼實(shí)現(xiàn) JDK 動(dòng)態(tài)代理,節(jié)省了不少代碼。
Spring AOP 和 動(dòng)態(tài)代理技術(shù)
MyBatis-Plus
官方地址:https://mp./
只要你的項(xiàng)目中有數(shù)據(jù)庫(kù)訪問(wèn),那你肯定用過(guò)或者至少聽(tīng)說(shuō)過(guò) MyBatis ,但是如果你只用 MyBatis 需要針對(duì)每個(gè)DAO方法寫(xiě)對(duì)應(yīng)的 SQL Statement(也就是 mapper.xml 中的代碼塊),當(dāng)然有一些自動(dòng)生成的工具,MyBatis 就有它提供的 MyBatis Generator,比如我也稍做加工,做過(guò)一個(gè) web 版的 MyBatis Generator,開(kāi)發(fā)效率是提高了,但是每個(gè) mapper.xml 文件的代碼量很大,于是 MyBatis-Plus 就要出場(chǎng)了。
官網(wǎng)上對(duì)他的定義如下:
-
只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑。
-
只需簡(jiǎn)單配置,即可快速進(jìn)行 CRUD 操作,從而節(jié)省大量時(shí)間。
- 熱加載、代碼生成、分頁(yè)、性能分析等功能一應(yīng)俱全。
最后,在配上 MybatisX IDEA 插件,也是可以了。
vjtools
官方地址:https://github.com/vipshop/vjtools 這是唯品會(huì)的開(kāi)源工具包,這里主要介紹其中的 vjkit 模塊,是關(guān)于文本,集合,并發(fā)等基礎(chǔ)功能的核心類(lèi)庫(kù)。這個(gè)庫(kù)是我很早之前搜索日期操作的時(shí)候偶然發(fā)現(xiàn)的,我發(fā)現(xiàn)里面日期處理的 API 相當(dāng)全面而且很實(shí)用,還在我的項(xiàng)目中用過(guò)一段時(shí)間。
最后
好用的工具庫(kù)可以提高我們的開(kāi)發(fā)效率,而且也是我們學(xué)習(xí)源碼的好去處,和其他的開(kāi)源框架(比如 Spring、Dubbo)一樣,看看優(yōu)秀的代碼是如何實(shí)現(xiàn)的。
如果你還知道什么好用、強(qiáng)大的開(kāi)源工具包,歡迎在留言區(qū)分享,好東西不能獨(dú)享,讓更多的人受益。
公眾號(hào):古時(shí)的風(fēng)箏
一個(gè)兼具深度與廣度的程序員鼓勵(lì)師,一個(gè)本打算寫(xiě)詩(shī)卻寫(xiě)起了代碼的田園碼農(nóng)!你可選擇現(xiàn)在就關(guān)注我,或者看看歷史文章再關(guān)注也不遲。
技術(shù)交流還可以加群或者直接加我微信。
來(lái)源:https://www./content-4-731251.html
|