我是風箏,公眾號「古時的風箏」,文章會收錄在 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
官方地址:https://mp.baomidou.com/
只要你的專案中有資料庫訪問,那你肯定用過或者至少聽說過 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)一樣,看看優秀的代碼是如何實作的,
如果你還知道什么好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益,
各位大佬,給個推薦,讓我奮發圖強
我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程式員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168190.html
標籤:Java
上一篇:C++使用set集合的問題
下一篇:Java實作的三種字串反轉

