1. 程式人生 > >別在重複造輪子了,幾個值得應用到專案中的 Java 開源庫送給你

別在重複造輪子了,幾個值得應用到專案中的 Java 開源庫送給你

> 我是風箏,公眾號「古時的風箏」。文章會收錄在 [JavaNewBee](https://github.com/huzhicheng/JavaNewBee) 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。公眾號回覆『666』獲取高清大圖。 風箏我作為一個野路子開發者,直到遇見下面的這幾個工具庫,才知道之前重複造了不少輪子,而且輪子還不一定有人家的圓。相信跟我一樣,沒事兒造輪子的人還不在少數,有些人就是對造輪子感興趣,這個咱也無話可說,但是,比如我,我是造輪子之前不知道這世上已經有好用的輪子了,害,無知限制了我的想象力。 比如我們在拿到一個 List 集合之後,要對這個集合進行判空操作,以前我一直是這樣寫的: ```java List list = getList(); if (list != null && list.size() > 0) { //do something } ``` 雖然這樣也沒什麼問題,但是,我懶啊,每次敲這麼多程式碼,也挺累啊。有同學說,那你包裝成一個方法不就行了,每次呼叫個方法就 OK 啦。這不,同學,你就在造輪子了,已經有人幫你寫好了這樣類似的一系列方法了。 來讓我們認識認識這些輪子吧。 ## Java 8 Stream Stream 不算是工具庫,但是通過 stream 提供的一系列方法,可以實現集合的過濾、分組、集合轉換等諸多操作。 例如下面的方法,實現列表元素根據某個欄位去重的功能。 ```java List userList = new ArrayList(); //新增元素 userList = userList.stream().filter(distinctByKey(user->user.getUserId())).collect(Collectors.toList()); private static Predicate distinctByKey(Function keyExtractor) { Map 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 專門用作集合處理。 下面舉幾個例子說明一下,更詳細的內容可以到官網檢視文件。 ### 字串判空操作 ```java String s = ""; Boolean isEmpty = StringUtils.isEmpty(s); ``` ### 獲取類的全名稱 ```java ClassUtils.getName(ClassUtils.class); ``` ### 判斷集合是否為空 ```java Boolean isNotEmpty = CollectionUtils.isNotEmpty(list); ``` ### 反射獲取某個類的所有 Field ```java Field[] fields = FieldUtils.getAllFields(User.class); ``` ## Google Guava 官方地址:https://github.com/google/guava 和 Apache Commons 有點兒類似,它也是包含了一系列的比如字串、集合、反射、數學計算等的操作封裝,還可以用作 JVM 快取。 舉幾個例子說明: ### New 各種物件 ```java List list = Lists.newArrayList(); Set set = Sets.newHashSet(); Map map = Maps.newConcurrentMap(); // 不可變集合 ImmutableList immutableList = ImmutableList.of("1", "2", "3"); ``` ### 列表轉符號分隔的字串 ```java List list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); String result = Joiner.on("-").join(list); > 1-2-3 ``` ### 求交集、並集、差集等 例如下面程式碼求 set1 和 set2 的交集 ```java Set set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6); Set set2 = Sets.newHashSet(1,2,3,4); Sets.SetView intersection = Sets.intersection(set1, set2); ``` ## Joda Time 官方地址:https://www.joda.org/joda-time/ 一個日期、時間處理的工具庫。如果你不是經常做日期處理,那差不多每次需要的時候都需要查詢相關的 API,而有了工具類就不一樣了,只要一個 “.”,你想要的方法就出現了,而 Joda Time 就是一款好用的工具庫。 比如下面這個方法,計算到新年還有多少天。 ```java 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 請求: ```java 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 請求: ```java 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 的話,那可能程式碼量增加不止一倍啊。 ![excel](https://tva1.sinaimg.cn/large/007S8ZIlly1gfec9ezjzsj31es0bwq9w.jpg) ## TinyPinyin 官方地址:https://github.com/promeG/TinyPinyin 中文轉拼音,把你輸入的中文轉換成拼音。比如搜尋功能要實現這樣的功能,輸入 “fengzheng” 搜尋,會匹配到 “風箏”這個詞語,這就需要中文轉拼音了。 有的同學說了,這不是拼音轉英文嗎?當然不是在輸入“fengzheng”的時候轉換了,而是在包含“風箏”的這條記錄中有一個拼音的額外欄位,這樣搜尋的時候直接匹配拼音那個欄位。 | chinese_name | pinyin_name | | ------------ | ----------- | | 風箏 | fengzheng | ## 反射工具庫 - jOOR 官方地址:https://github.com/jOOQ/jOOR 它是 JDK 反射包的友好封裝,通過一系列簡單友好的鏈式操作實現反射呼叫。比如下面這個例子 ```java 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](https://mp.weixin.qq.com/s/bVrguGlUpxeoqT__6E176w),開發效率是提高了,但是每個 mapper.xml 檔案的程式碼量很大,於是 MyBatis-Plus 就要出場了。 官網上對他的定義如下: 1. 只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。 2. 只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間。 3. 熱載入、程式碼生成、分頁、效能分析等功能一應俱全。 最後,在配上 MybatisX IDEA 外掛,也是可以了。 ## vjtools 官方地址:https://github.com/vipshop/vjtools 這是唯品會的開源工具包,這裡主要介紹其中的 vjkit 模組,是關於文字,集合,併發等基礎功能的核心類庫。這個庫是我很早之前搜尋日期操作的時候偶然發現的,我發現裡面日期處理的 API 相當全面而且很實用,還在我的專案中用過一段時間。 ## 最後 好用的工具庫可以提高我們的開發效率,而且也是我們學習原始碼的好去處,和其他的開源框架(比如 Spring、Dubbo)一樣,看看優秀的程式碼是如何實現的。 如果你還知道什麼好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益。 **各位大佬,給個推薦,讓我奮發圖強** > **我是風箏,公眾號「古時的風箏」。一個兼具深度與廣度的程式設計師鼓勵師,一個本打算寫詩卻寫起了程式碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲。** ![](https://img2020.cnblogs.com/blog/273364/202006/273364-20200609095058934-1213591008.jpg)