「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
前言
你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈…挺好。
今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必须是 Apache 下的 Commons 库。第二个是 google 开源的 Guava 库。
Apache Commons
Apache Commons 是一个功能非常强大、经常被使用到的库。它有 40 个左右的类库,包含了对字符串、日期、数组等的操作。
Lang3
Lang3 是一个处理 Java 中基本对象的包,比如用 StringUtils 类操作字符串、ArrayUtils 类操作数组、DateUtils 类可以处理日期、MutablePair 类可以返回多个字段等等。
包结构:
maven 依赖
1 | java复制代码<dependency> |
字符串操作
对字符串快速操作,在 if else 的少写判空条件。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | vbnet复制代码true |
日期操作
终于可以不用 SimpleDateFormat 格式化日期了,DateUtils.iterator 可以获取一段时间。
1 | java复制代码public static void main(String[] args) throws ParseException { |
输出结果:
1 | yaml复制代码Fri Jul 16 00:00:00 CST 2021 |
返回多个字段
有时候在一个方法中需要返回多个值的时候,经常会使用 HashMap 返回或者是 JSON 返回。Lang3 下已经帮我们提供了这样的工具类,不需要再多写 HashMap 和 JSON 了。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | vbnet复制代码2 这是两个值 |
ArrayUtils 数组操作
ArrayUtils 是专门处理数组的类,可以让方便的处理数组而不是需要各种循环操作。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | vbnet复制代码array3:{value1,value2,value3,value4} |
EnumUtils 枚举操作
- getEnum(Class enumClass, String enumName) 通过类返回一个枚举,可能返回空;
- getEnumList(Class enumClass) 通过类返回一个枚举集合;
- getEnumMap(Class enumClass) 通过类返回一个枚举map;
- isValidEnum(Class enumClass, String enumName) 验证enumName是否在枚举中,返回true或false。
1 | java复制代码public enum ImagesTypeEnum { |
1 | java复制代码 public static void main(String[] args) { |
输出结果:
1 | ini复制代码imagesTypeEnum = JPG |
collections4 集合操作
commons-collections4 增强了 Java 集合框架,提供了一系列简单的 API 方便操作集合。
maven 依赖
1 | java复制代码 <dependency> |
CollectionUtils 工具类
这是一个工具类,可以检查 null 元素不被加入集合,合并列表,过滤列表,两个列表的并集、差集、合集。有部分功能在 Java 8 中可以被 Stream API 替换。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | less复制代码1 |
Bag 统计次数
用于统计值在集合中出现的次数。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | ruby复制代码[2:a,1:b,3:c] |
beanutils Bean 操作
beanutils 是通过反射机制对 JavaBean 进行操作的。比如对 Bean 进行复制、map 转对象、对象转 Map。
maven 依赖
1 | java复制代码<dependency> |
1 | java复制代码public class User { |
1 | java复制代码public static void main(String[] args) throws Exception { |
输出结果:
1 | ini复制代码李四 |
Guava
Google 开源的一个基于 Java 扩展项目,包含了一些基本工具、集合扩展、缓存、并发工具包、字符串处理等。
maven 依赖
1 | java复制代码<dependency> |
Map<String, List> 类型
在java 代码中经常会遇到需要写 Map<String, List> map 的局部变量的时候。有时候业务情况还会更复杂一点。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | css复制代码[张三, 李四] |
value 不能重复的 Map
在 Map 中 value 的值时可以重复的,Guava 可以创建一个 value 不可重复的 Map,并且 Map 和 value 可以对调。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | php复制代码Exception in thread "main" java.lang.IllegalArgumentException: value already present: value |
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | vbnet复制代码value1 |
Guava cache
写业务的时候肯定会使用缓存,当不想用第三方作为缓存的时候,Map 又不够强大,就可以使用 Guava 的缓存。
缓存的并发级别
Guava提供了设置并发级别的API
,使得缓存支持并发的写入和读取。与ConcurrentHashMap
类似,Guava cache的并发也是通过分离锁实现。在通常情况下,推荐将并发级别设置为服务器cpu核心数。
1 | java复制代码CacheBuilder.newBuilder() |
缓存的初始容量设置
我们在构建缓存时可以为缓存设置一个合理大小初始容量,由于Guava的缓存使用了分离锁的机制,扩容的代价非常昂贵。所以合理的初始容量能够减少缓存容器的扩容次数。
1 | java复制代码CacheBuilder.newBuilder() |
设置最大存储
Guava Cache可以在构建缓存对象时指定缓存所能够存储的最大记录数量。当Cache中的记录数量达到最大值后再调用put方法向其中添加对象,Guava会先从当前缓存的对象记录中选择一条删除掉,腾出空间后再将新的对象存储到Cache中。
1 | java复制代码public static void main(String[] args) { |
输出结果:
1 | vbscript复制代码null |
过期时间
expireAfterAccess() 可以设置缓存的过期时间。
1 | java复制代码public static void main(String[] args) throws InterruptedException { |
输出结果:
1 | vbscript复制代码value1 |
LoadingCache
使用自定义ClassLoader
加载数据,置入内存中。从LoadingCache
中获取数据时,若数据存在则直接返回;若数据不存在,则根据ClassLoader
的load
方法加载数据至内存,然后返回该数据。
1 | java复制代码public class Test { |
输出结果:
1 | java复制代码no cache |
总结
通过 Apache Commons 和 Guava 两个第三方的开源工具库,可以减少循环、ifelse 的代码。写出的代码更有健壮性并且可以在新人面前装一波。Apache Commons 和 Guava 有许许多多的工具类,这里只列出了小小的部分,可以在官网例子中查看到各种用法。
最后
我是一个正在被打击还在努力前进的码农。如果文章对你有帮助,记得点赞、关注哟,谢谢!
本文转载自: 掘金