別在重複造輪子了,這幾個開源工具庫送你了

來自專輯
工具推薦
別在重複造輪子了,這幾個開源工具庫送你了
古時的風箏第 74 篇原創文章 java

風箏我做爲一個野路子開發者,直到碰見下面的這幾個工具庫,才知道以前重複造了很多輪子,並且輪子還不必定有人家的圓。相信跟我同樣,沒事兒造輪子的人還不在少數,有些人就是對造輪子感興趣,這個咱也無話可說,可是,好比我,我是造輪子以前不知道這世上已經有好用的輪子了,害,無知限制了個人想象力。
好比咱們在拿到一個 List 集合以後,要對這個集合進行判空操做,之前我一直是這樣寫的:git

List<String> list = getList();
if (list != null && list.size() > 0) {
    //do something
}

雖然這樣也沒什麼問題,可是,我懶啊,每次敲這麼多代碼,也挺累啊。有同窗說,那你包裝成一個方法不就好了,每次調用個方法就 OK 啦。這不,同窗,你就在造輪子了,已經有人幫你寫好了這樣相似的一系列方法了。
來讓咱們認識認識這些輪子吧。程序員

Java 8 Streamgithub

Stream 不算是工具庫,可是經過 stream 提供的一系列方法,能夠實現集合的過濾、分組、集合轉換等諸多操做。
例以下面的方法,實現列表元素根據某個字段去重的功能。web

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 專門用做集合處理。
下面舉幾個例子說明一下,更詳細的內容能夠到官網查看文檔。數據庫

字符串判空操做apache

String s = "";
Boolean isEmpty = StringUtils.isEmpty(s);

獲取類的全名稱json

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 的話,那可能代碼量增長不止一倍啊。
別在重複造輪子了,這幾個開源工具庫送你了

excel
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 動態代理,節省了很多代碼。

Spring AOP 和 動態代理技術

MyBatis-Plus

官方地址:https://mp.baomidou.com/

只要你的項目中有數據庫訪問,那你確定用過或者至少據說過 MyBatis ,可是若是你只用 MyBatis 須要針對每一個DAO方法寫對應的 SQL Statement(也就是 mapper.xml 中的代碼塊),固然有一些自動生成的工具,MyBatis 就有它提供的 MyBatis Generator,好比我也稍作加工,作過一個 web 版的 MyBatis Generator,開發效率是提升了,可是每一個 mapper.xml 文件的代碼量很大,因而 MyBatis-Plus 就要出場了。

官網上對他的定義以下:

  1. 只作加強不作改變,引入它不會對現有工程產生影響,如絲般順滑。

  2. 只需簡單配置,便可快速進行 CRUD 操做,從而節省大量時間。

  3. 熱加載、代碼生成、分頁、性能分析等功能包羅萬象。

最後,在配上 MybatisX IDEA 插件,也是能夠了。

vjtools

官方地址:https://github.com/vipshop/vjtools
這是惟品會的開源工具包,這裏主要介紹其中的 vjkit 模塊,是關於文本,集合,併發等基礎功能的核心類庫。這個庫是我很早以前搜索日期操做的時候偶然發現的,我發現裏面日期處理的 API 至關全面並且很實用,還在個人項目中用過一段時間。

最後

好用的工具庫能夠提升咱們的開發效率,並且也是咱們學習源碼的好去處,和其餘的開源框架(好比 Spring、Dubbo)同樣,看看優秀的代碼是如何實現的。

若是你還知道什麼好用、強大的開源工具包,歡迎在留言區分享,好東西不能獨享,讓更多的人受益。

公衆號:古時的風箏

一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇如今就關注我,或者看看歷史文章再關注也不遲。

技術交流還能夠加羣或者直接加我微信。
別在重複造輪子了,這幾個開源工具庫送你了

相關文章
相關標籤/搜索