来自专辑
工具推荐
古时的风筝第 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
只要你的项目中有数据库访问,那你确定用过或者至少据说过 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)同样,看看优秀的代码是如何实现的。
公众号:古时的风筝
一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!你可选择如今就关注我,或者看看历史文章再关注也不迟。
技术交流还能够加群或者直接加我微信。