我是風箏,公衆號「古時的風箏」。文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。公衆號回覆『666』獲取高清大圖。java
風箏我做爲一個野路子開發者,直到碰見下面的這幾個工具庫,才知道以前重複造了很多輪子,並且輪子還不必定有人家的圓。相信跟我同樣,沒事兒造輪子的人還不在少數,有些人就是對造輪子感興趣,這個咱也無話可說,可是,好比我,我是造輪子以前不知道這世上已經有好用的輪子了,害,無知限制了個人想象力。git
好比咱們在拿到一個 List 集合以後,要對這個集合進行判空操做,之前我一直是這樣寫的:程序員
List<String> list = getList();
if (list != null && list.size() > 0) { //do something } 複製代碼
雖然這樣也沒什麼問題,可是,我懶啊,每次敲這麼多代碼,也挺累啊。有同窗說,那你包裝成一個方法不就好了,每次調用個方法就 OK 啦。這不,同窗,你就在造輪子了,已經有人幫你寫好了這樣相似的一系列方法了。github
來讓咱們認識認識這些輪子吧。web
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; } 複製代碼
官方地址:http://commons.apache.org/apache
這不是一個庫,而是一系列的工具庫。json
因爲包含的庫過多,我就不一一列舉了,能夠到官網一探。有集合處理的、數學計算的、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[] fields = FieldUtils.getAllFields(User.class);
複製代碼
官方地址:https://github.com/google/guava
和 Apache Commons 有點兒相似,它也是包含了一系列的好比字符串、集合、反射、數學計算等的操做封裝,還能夠用做 JVM 緩存。
舉幾個例子說明:
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); 複製代碼
官方地址: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); } 複製代碼
官方地址: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(); } } 複製代碼
Spring 默認的 Json 序列化工具,其實已經足夠用了。
Google 出品,功能齊全。
阿里出品,算法良好,性能最優。
官方地址:https://www.yuque.com/easyexcel/doc/easyexcel
阿里開源的 Excel 操做工具庫,能夠看作是 Apache POI 的加強封裝版、優化版。
若是你的數據量很大,那用 EasyExcel 能夠節省內存,提高效率,而且沒有併發風險。
若是你的 Excel 足夠複雜,那用 EasyExcel 會比你直接用 POI 少些不少代碼。
好比我實現了下面這個 Excel 動態導出,包括動態表頭、動態合併單元格的功能,只用了不多的代碼,若是是使用 POI 的話,那可能代碼量增長不止一倍啊。
官方地址:https://github.com/promeG/TinyPinyin
中文轉拼音,把你輸入的中文轉換成拼音。好比搜索功能要實現這樣的功能,輸入 「fengzheng」 搜索,會匹配到 「風箏」這個詞語,這就須要中文轉拼音了。
有的同窗說了,這不是拼音轉英文嗎?固然不是在輸入「fengzheng」的時候轉換了,而是在包含「風箏」的這條記錄中有一個拼音的額外字段,這樣搜索的時候直接匹配拼音那個字段。
chinese_name | pinyin_name |
---|---|
風箏 | fengzheng |
官方地址: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 動態代理,節省了很多代碼。
官方地址:https://mp.baomidou.com/
只要你的項目中有數據庫訪問,那你確定用過或者至少據說過 MyBatis ,可是若是你只用 MyBatis 須要針對每一個DAO方法寫對應的 SQL Statement(也就是 mapper.xml 中的代碼塊),固然有一些自動生成的工具,MyBatis 就有它提供的 MyBatis Generator,好比我也稍作加工,作過一個web 版的 MyBatis Generator,開發效率是提升了,可是每一個 mapper.xml 文件的代碼量很大,因而 MyBatis-Plus 就要出場了。
官網上對他的定義以下:
最後,在配上 MybatisX IDEA 插件,也是能夠了。
官方地址:https://github.com/vipshop/vjtools
這是惟品會的開源工具包,這裏主要介紹其中的 vjkit 模塊,是關於文本,集合,併發等基礎功能的核心類庫。這個庫是我很早以前搜索日期操做的時候偶然發現的,我發現裏面日期處理的 API 至關全面並且很實用,還在個人項目中用過一段時間。
好用的工具庫能夠提升咱們的開發效率,並且也是咱們學習源碼的好去處,和其餘的開源框架(好比 Spring、Dubbo)同樣,看看優秀的代碼是如何實現的。
若是你還知道什麼好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益。
壯士且慢,先給點個贊吧,老是被白嫖,身體吃不消!
我是風箏,公衆號「古時的風箏」。一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇如今就關注我,或者看看歷史文章再關注也不遲。