别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你
我是风筝,公众号「古时的风筝」。文章会收录在 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
只要你的项目中有数据库访问,那你肯定用过或者至少听说过 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)一样,看看优秀的代码是如何实现的。
如果你还知道什么好用、强大的开源工具包,欢迎在留言区分享,好东西不能独享,让更多的人受益。
各位大佬,给个推荐,让我奋发图强
我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!你可选择现在就关注我,或者看看历史文章再关注也不迟。
别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你的更多相关文章
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。
1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...
- 第27篇 重复造轮子---模拟IIS服务器
在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...
- 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)
一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...
- Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写(全部用POSIX C实现)
Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写实现了日志.原子操作.哈希字典.红黑树.动态库加载.线程.锁操作.配置文件.os适配层.事件驱动.工作队列.RPC.IPC ...
- 重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关
重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关 引言 重复造轮子系列是自己平时的一些总结.有的轮子依赖社区提供的轮子为基础,这里把使用过程的一些觉得有意思的做个分享.有些思路或者方法在 ...
- 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印
重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...
- Meteva——让预报检验不再重复造轮子
更多精彩,请点击上方蓝字关注我们! 检验是什么?****预报准确率的客观表达 说到天气预报,你最先会想到什么? 早上听了预报,带了一天伞却没下一滴雨的调侃? 还是 "蓝天白云晴空万里突然暴风 ...
- 答应我,用了这个jupyter插件,别再重复造轮子了
1 简介 在使用Python.R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题: p ...
随机推荐
- ASP.NET Core依赖注入(DI)
ASP.NET Core允许我们指定注册服务的生存期.服务实例将根据指定的生存时间自动处理.因此,我们无需担心清理此依赖关系,他将由ASP.NET Core框架处理.有如下三种类型的生命周期. 关于依 ...
- ql的python学习之路-day13
前言:本节主要学习模块 一.模块的定义 模块:本质是.py结尾的python文件(文件名:test.py,对应的模块是:test),用来从逻辑上组织python代码(变量.函数.类.逻辑,本质是实现一 ...
- 实现es6中的set和map
转载自: https://www.cnblogs.com/hui-fly/p/9459152.html https://blog.csdn.net/roamingcode/article/detail ...
- 文本分类—day00_导读
新公司有文本分类的服务,看上去很高级,想探究一下里面的东东.并且最近人工智能,深度学习实在是太火了,出去聊天,不会点cnn算法,都不好意思搭话.后面会出文本分类相关的内容,希望能做到类似实验楼一样的实 ...
- UVA11038
题目大意:见刘汝佳<算法竞赛入门经典——训练指南>P173 解题思路: 求出 0 到 m-1 这些数字中 0 出现的次数(此处要特判 m = 0 的情况),再求出 0 到 n 这些数字中 ...
- Spring Boot 教程 (3) - RESTful
Spring Boot 教程 - RESTful 1. RESTful风格 1.1 简介与特点 RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式 ...
- Oracle 操作权限
alter user scott account unlock; 解锁 -- 新建用户create user yym identified by 123456; -- 放开用户权限grant conn ...
- 使用PInvoke互操作,让C#和C++愉快的交互优势互补
一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet ...
- [JavaWeb基础] 003.JAVA访问Mysql数据库
上面两篇讲解了简单的JSP + Servlet的搭建和请求,那么后面我们肯定要用到数据交互,也就是操纵数据库的数据,包括对数字的增加,删除,修改,查询.我们就用简单的MySql来做例子 我们需要引入驱 ...
- Parrot os安装nvidia失败恢复
因为两种显卡,amd和nvidia,所以按照parrot官方文档安装驱动,结果可想而知,安装失败--- 内心万马奔腾,去国外论坛也发现很多求助的小伙伴,所以有了我这次随笔,如何恢复你的parrot 黑 ...