我是風箏,公眾號「古時的風箏」。文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。公眾號回覆『666』獲取高清大圖。
風箏我作為一個野路子開發者,直到遇見下面的這幾個工具庫,才知道之前重複造了不少輪子,而且輪子還不一定有人家的圓。相信跟我一樣,沒事兒造輪子的人還不在少數,有些人就是對造輪子感興趣,這個我們也無話可說,但是,比如我,我是造輪子之前不知道這世上已經有好用的輪子了,害,無知限制了我的想象力。
比如我們在拿到一個 List 集合之後,要對這個集合進行判空操作,以前我一直是這樣寫的:
List<String> list = getList();
if (list != null && list.size() > 0) {
//do something
}
雖然這樣也沒什麼問題,但是,我懶啊,每次敲這麼多程式碼,也挺累啊。有同學說,那你包裝成一個方法不就行了,每次呼叫個方法就 OK 啦。這不,同學,你就在造輪子了,已經有人幫你寫好了這樣類似的一系列方法了。
來讓我們認識認識這些輪子吧。
Java 8 Stream
Stream 不算是工具庫,但是通過 stream 提供的一系列方法,可以實現集合的過濾、分組、集合轉換等諸多操作。
例如下面的方法,實現列表元素根據某個欄位去重的功能。
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.apache.org/
這不是一個庫,而是一系列的工具庫。
由於包含的庫過多,我就不一一列舉了,可以到官網一探。有集合處理的、數學計算的、IO 操作的等等,其中最常用的莫過於 Apache Commons Lang 和 Apache Commons Collections 這兩個。
Apache Commons Lang 包括一系列工具類,有字串相關的、時間處理的、反射的、併發包的等等,Apache Commons Collections 專門用作集合處理。
下面舉幾個例子說明一下,更詳細的內容可以到官網檢視文件。
字串判空操作
String s = "";
Boolean isEmpty = StringUtils.isEmpty(s);
獲取類的全名稱
ClassUtils.getName(ClassUtils.class);
判斷集合是否為空
Boolean isNotEmpty = CollectionUtils.isNotEmpty(list);
反射獲取某個類的所有 Field
Field[] fields = FieldUtils.getAllFields(User.class);
Google Guava
官方地址:https://github.com/google/guava
和 Apache Commons 有點兒類似,它也是包含了一系列的比如字串、集合、反射、數學計算等的操作封裝,還可以用作 JVM 快取。
舉幾個例子說明:
New 各種物件
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String,Object> map = Maps.newConcurrentMap();
// 不可變集合
ImmutableList<String> immutableList = ImmutableList.of("1", "2", "3");
列表轉符號分隔的字串
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.org/joda-time/
一個日期、時間處理的工具庫。如果你不是經常做日期處理,那差不多每次需要的時候都需要查詢相關的 API,而有了工具類就不一樣了,只要一個 “.”,你想要的方法就出現了,而 Joda Time 就是一款好用的工具庫。
比如下面這個方法,計算到新年還有多少天。
public Days daysToNewYear(LocalDate fromDate) {
LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
return Days.daysBetween(fromDate, newYear);
}
OkHttp3
官方地址:https://square.github.io/okhttp/
一個 HTTP 客戶端,使用簡單,效能良好,是時候放棄 HttpClient 了。
一個 get 請求:
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();
}
}
一個 post 請求:
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 預設的 Json 序列化工具,其實已經足夠用了。
Gson
Google 出品,功能齊全。
FastJson
阿里出品,演算法良好,效能最優。
EasyExcel
官方地址:https://www.yuque.com/easyexcel/doc/easyexcel
阿里開源的 Excel 操作工具庫,可以看做是 Apache POI 的增強封裝版、優化版。
如果你的資料量很大,那用 EasyExcel 可以節省記憶體,提升效率,並且沒有併發風險。
如果你的 Excel 足夠複雜,那用 EasyExcel 會比你直接用 POI 少些很多程式碼。
比如我實現了下面這個 Excel 動態匯出,包括動態表頭、動態合併單元格的功能,只用了很少的程式碼,如果是使用 POI 的話,那可能程式碼量增加不止一倍啊。
TinyPinyin
官方地址:https://github.com/promeG/TinyPinyin
中文轉拼音,把你輸入的中文轉換成拼音。比如搜尋功能要實現這樣的功能,輸入 “fengzheng” 搜尋,會匹配到 “風箏”這個詞語,這就需要中文轉拼音了。
有的同學說了,這不是拼音轉英文嗎?當然不是在輸入“fengzheng”的時候轉換了,而是在包含“風箏”的這條記錄中有一個拼音的額外欄位,這樣搜尋的時候直接匹配拼音那個欄位。
chinese_name | pinyin_name |
---|---|
風箏 | fengzheng |
反射工具庫 - jOOR
官方地址:https://github.com/jOOQ/jOOR
它是 JDK 反射包的友好封裝,通過一系列簡單友好的鏈式操作實現反射呼叫。比如下面這個例子
public interface StringProxy {
String substring(int beginIndex);
}
String substring = on("java.lang.String")
.create("Hello World")
.as(StringProxy.class)
.substring(6);
簡單的程式碼實現 JDK 動態代理,節省了不少程式碼。
MyBatis-Plus
只要你的專案中有資料庫訪問,那你肯定用過或者至少聽說過 MyBatis ,但是如果你只用 MyBatis 需要針對每個DAO方法寫對應的 SQL Statement(也就是 mapper.xml 中的程式碼塊),當然有一些自動生成的工具,MyBatis 就有它提供的 MyBatis Generator,比如我也稍做加工,做過一個web 版的 MyBatis Generator,開發效率是提高了,但是每個 mapper.xml 檔案的程式碼量很大,於是 MyBatis-Plus 就要出場了。
官網上對他的定義如下:
- 只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。
- 只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間。
- 熱載入、程式碼生成、分頁、效能分析等功能一應俱全。
最後,在配上 MybatisX IDEA 外掛,也是可以了。
vjtools
官方地址:https://github.com/vipshop/vjtools
這是唯品會的開源工具包,這裡主要介紹其中的 vjkit 模組,是關於文字,集合,併發等基礎功能的核心類庫。這個庫是我很早之前搜尋日期操作的時候偶然發現的,我發現裡面日期處理的 API 相當全面而且很實用,還在我的專案中用過一段時間。
最後
好用的工具庫可以提高我們的開發效率,而且也是我們學習原始碼的好去處,和其他的開源框架(比如 Spring、Dubbo)一樣,看看優秀的程式碼是如何實現的。
如果你還知道什麼好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益。
各位大佬,給個推薦,讓我奮發圖強
我是風箏,公眾號「古時的風箏」。一個兼具深度與廣度的程式設計師鼓勵師,一個本打算寫詩卻寫起了程式碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲。