介绍几个好用的工具类
The end is also the new beginning
最近真的是忙的飞起啊!!年前还得更新一个版本,啊难受啊...趁今天有空,上来冒个泡😆
好,入正题,今天介绍几个非常实用的工具类,可以减少我们重复造轮子,专注于具体的业务编写,提升生产效率,如果你还没有使用过这些工具类,强烈推荐去使用一下,你会发现代码清爽很多
1.apache-commons-lang3
相信大家在写代码的时候都会遇到,需要对字符串进行各种操作,例如判断是否为空,判断字符串是否全大/小写,是否包含某个字符串,是否以某个前缀开始/后缀结束,等等等等
由于String字符串提供的操作是有限的,不妨使用一下这个工具类感受一下
<!-- 引入依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
1.1 判断字符串是否为空
import org.apache.commons.lang3.StringUtils;
/**
* 判断字符串是否为空,【common--lang3】
* @param str 传入字符串
* @return 是否为空boolean值
*/
private static boolean commonlang3IsEmpty(String str) {
return StringUtils.isEmpty(str);
}
//源码其实就是
return cs == null || cs.length() == 0;
1.2 判断字符串是否为空(空字符也算空)
import org.apache.commons.lang3.StringUtils;
//isBlank跟isEmpty的区别就在于,如果字符串是由一串空格组成的,isEmpty会返回false,isBlank会返回true
private static boolean commonlang3IsBlank(String str) {
return StringUtils.isBlank(str);
}
//源码注释写的很清楚,这个方法会比isEmpty更加的严谨
1.3 同时判断多个字符串是否都为Empty,或者Blank
StringUtils.isAllEmpty(CharSequence... css);
StringUtils.isAllBlank(CharSequence... css);
1.4 判断字符串是否全大/小写
private static boolean isAllUpperCase(String str) {
//判断小写,把Upper换成lower即可
return StringUtils.isAllUpperCase(str);
}
//这个就很常用了,String中是没有这个方法的,就得使用Character.isUpperCase来一个一个字符的判断,属于重复造轮子
1.5 判断指定字符串是否以某个前缀开头(可以忽略大小写)
private static boolean isStartWithPrefix(String str, String prefix) {
//忽略大小写 StringUtils.startsWithIgnoreCase(str, prefix);
return StringUtils.startsWith(str, prefix);
}
//相似的,后缀suffix也是差不多的api StringUtils.endWith(String str,String suffix)
当然,commons中其实还有很多很有用的工具类,不仅仅只针对字符串方面的,我是使用StringUtils比较多,所以就拿它作为讲解,commons具体还有那些个方面的工具类,就由待你自己去发掘啦,比如时间格式化工具类、线程工具类、并发工具类等等
2.apache-commons-collections4
从包名应该就猜得出来,这是对集合进行操作的工具类,挑几个常用的方法来介绍一下
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
2.1 判断集合是否为空
private static boolean isCollectionEmpty(Collection collection) {
return CollectionUtils.isEmpty(collection);
}
//注意接收的是Collection接口,所以所有实现了Collection的类都可以传入判断
2.2 返回两个集合的交/并集
这个是很常用的,某些场景我们需要对两个集合中的值进行操作,返回一个新的集合
//union -> 并集
private static Collection<Integer> getUnion(Collection<Integer> cola,Collection<Integer> colb) {
return CollectionUtils.union(cola, colb);
}
//构造两个list
List<Integer> listA = Arrays.asList(1 ,2 ,3 ,4 ,5);
List<Integer> listB = Arrays.asList(4,5,6,7);
//调用方法后的结果是
[1, 2, 3, 4, 5, 6, 7]
//intersection -> 交集
private static Collection<Integer> getIntersection(Collection<Integer> cola,Collection<Integer> colb) {
return CollectionUtils.intersection(cola, colb);
}
//同样还是上述两个list,操作之后
[4, 5]
2.3 过滤集合中不符合条件的元素
//第一个参数接收一个集合
//第二个参数是一个谓词判断条件,如果不为真就从集合中移除,这里就是想返回一个偶数列表
private static boolean filter(Collection<Integer> collection) {
return CollectionUtils.filter(collection,
object -> object % 2 != 1);
}
//list 【0,1 ,2 ,3 ,4 ,5,6,7,8,9,10】
//调用方法后返回
[0, 2, 4, 6, 8, 10]
2.4 针对Map的MapUtils
2.4.1 判断Map是否为空
private static boolean isMapEmpty(Map<?,?> map) {
return MapUtils.isEmpty(map);
}
2.4.2 将Map的Value转换成对应的类型值
这里以getLongValue来做一个介绍
//可以注意到此时Map的key是String类型的,value也是String类型的,我们要把value转换成Long并且返回
private static Long getLongValue(Map<String,String> map) {
return MapUtils.getLongValue(map, "key1");
}
Map<String,String> map = new HashMap<>();
map.put("key1", "12345");
Long longValue = getLongValue(map);
System.out.println(longValue);
//结果是longValue = 12345L
//如果传入String不是能转成Long类型的字符串,就会返回0,也可以通过重载方法,指定一个default值
MapUtils工具类提供了很多重载的形式,适合不同的场景使用
2.4.3 将数组中的元素放到Map中
private static Map<?,?> putAll(Map<?,?> map, Object[] array) {
return MapUtils.putAll(map, array);
}
//如果传入的是一个二维数组
String[][] twoDimensionalArray = new String[][] {
{"key1","value1"},
{"key2","value2"},
{"key3","value3"},
};
Map<?, ?> map = putAll(new HashMap<>() ,twoDimensionalArray);
System.out.println(map);
结果:{key1=value1, key2=value2, key3=value3}
//如果传入的是一个一维数组
String[] array = new String[] {
"key1","value1","key2","value2","key3","value3"
};
Map<?, ?> map = putAll(new HashMap<>() ,array);
System.out.println(map);
结果:{key1=value1, key2=value2, key3=value3}, 如果传入的数组是有问题的,就会把对应的key-value抛弃
也就是说,如果数组没有给出 "value3"这个元素,对应的key3就不会被添加到Map中
//如果传入的是Map.Entry
Map.Entry[] entries = new Map.Entry[] {
new DefaultMapEntry("key1","value1"),
new DefaultMapEntry("key2","value2"),
new DefaultMapEntry("key3","value3")
};
Map<?, ?> map = putAll(new HashMap<>() ,entries);
System.out.println(map);
结果:{key1=value1, key2=value2, key3=value3}
collection4这个包就介绍这么多,大家也可以去看下这个包还提供那些工具类,例如针对Set的、Queue的等等都有
3.Hutool工具类包
官网:点击打开
官方介绍:
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
简而言之,里边包含了我们日常开发中的会应用到工具类的各个场景,例如
- 时间的转换工具
- 生成全局唯一id
- 文件流的操作
- 日志操作
- .....
具体的使用例子,直接看官方文档即可
总结
其实还是有很多其他很有用的工具类的,例如Google guava,上面没列出来的原因是(主要是懒了,有兴趣的去查查资料即可),找到适合使用的,足够稳定的,性能又可以的,就可以了,commons-collection4和guava都提供了对集合的简易操作,根据喜欢选其一就好
还得看业务场景的需要啊,有得用就用(稳定性得考虑好),没必要自己重复造轮子,造一大堆轮子,效率还可能没别人的好,既浪费时间也浪费精力,当然你说我就想自己造一个,那当然可以,这里也只是提出一个建议而已