介绍几个好用的工具类

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工具类提供了很多重载的形式,适合不同的场景使用

image-20220109165832157

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都提供了对集合的简易操作,根据喜欢选其一就好

还得看业务场景的需要啊,有得用就用(稳定性得考虑好),没必要自己重复造轮子,造一大堆轮子,效率还可能没别人的好,既浪费时间也浪费精力,当然你说我就想自己造一个,那当然可以,这里也只是提出一个建议而已

posted @ 2022-01-09 20:47  码农Amg  阅读(940)  评论(0编辑  收藏  举报