轮子在我看来是可以重复利用的东西。好的程序猿肯定会有一个自己的代码库,里面是一些平时积累的工具代码。当需要的时候拿来就能用,简直妙不可言。来让我们认识认识这些轮子吧。

Java 8 Stream

  Stream 不算是工具库,但是通过 stream 提供的一系列方法,可以实现集合的过滤、分组、集合转换等诸多操作。

例如下面的方法,实现列表元素根据某个字段去重的功能。

1
2
3
4
5
6
7
8
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 专门用作集合处理。

下面举几个例子说明一下,更详细的内容可以到官网查看文档。

  • 字符串判空操作
1
2
String s = "";
Boolean isEmpty = StringUtils.isEmpty(s);
  • 判断集合是否为空
1
Boolean isNotEmpty = CollectionUtils.isNotEmpty(list);
  • 获取类的全名称
1
ClassUtils.getName(ClassUtils.class);
  • 反射获取某个类的所有 Field
1
Field[] fields = FieldUtils.getAllFields(User.class);

Google Guava

官方地址:https://github.com/google/guava

  和 Apache Commons 有点儿类似,它也是包含了一系列的比如字符串、集合、反射、数学计算等的操作封装,还可以用作 JVM 缓存。

  • New 各种对象
1
2
3
4
5
6
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String,Object> map = Maps.newConcurrentMap();

// 不可变集合
ImmutableList<String> immutableList = ImmutableList.of("1", "2", "3");
  • 列表转符号分隔的字符串
1
2
3
4
5
6
7
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String result = Joiner.on("-").join(list);

> 1-2-3
  • 求交集、并集、差集等
1
2
3
4
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6);
Set<Integer> set2 = Sets.newHashSet(1,2,3,4);
// 求 set1 和 set2 的交集
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);

OkHttp3

官方地址:https://square.github.io/okhttp/

  一个 HTTP 客户端,使用简单,性能良好,是时候放弃 HttpClient 了。

  • get请求
1
2
3
4
5
6
7
8
9
10
11
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请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 少些很多代码。

Hutool

官方地址:https://hutool.cn/docs/#/

  • 一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:
模块 介绍
hutool-aop JDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache 简单缓存实现
hutool-core 核心,包括Bean操作、日期、各种Util等
hutool-cron 定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto 加密解密模块,提供对称、非对称和摘要算法封装
hutool-db JDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa 基于DFA模型的多关键字查找
hutool-extra 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http 基于HttpUrlConnection的Http客户端封装
hutool-log 自动识别日志实现的日志门面
hutool-script 脚本执行封装,例如Javascript
hutool-setting 功能更强大的Setting配置文件和Properties封装
hutool-system 系统参数调用封装(JVM信息等)
hutool-json JSON实现
hutool-captcha 图片验证码实现
hutool-poi 针对POI中Excel和Word的封装
hutool-socket 基于Java的NIO和AIO的Socket封装

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。