1 集合工具类
1.1 java.util.Collections
使用的基本list示意
List list = new ArrayList();
list.add(2);
list.add(1);
list.add(3);
1.1.1 基本操作
Collections.sort(list);//升序
Collections.reverse(list);//降序
Collections.max(list);//获取最大值
Collections.min(list);//获取最小值
Collections.emptyList();//空集合
Collections.binarySearch(list, 3);//二分查找
Collections.unmodifiableList(list);//转换成不可修改集合
1.1.2 转换线程安全集合
我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程不安全的。
换句话说,这些集合在多线程的环境中,添加数据会出现异常。
这时,可以用Collections的synchronizedxxx方法,将这些线程不安全的集合,直接转换成线程安全集合。例如
List list = new ArrayList();
list.add(2);
list.add(1);
list.add(3);
List integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
System.out.println(integers);
它的底层会创建SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized加锁
1.2 org.springframework.util.CollectionUtils
常用方法:
1.3 org.apache.commons.collections.CollectionUtils
常用方法:
常用方法:
CollectionUtils.isEmpty();//集合判空
CollectionUtils.union(list, list2);//获取并集
CollectionUtils.intersection(list, list2);//获取交集
CollectionUtils.disjunction(list, list2);//获取交集的补集
CollectionUtils.subtract(list, list2);//获取差集
CollectionUtils.select:根据条件筛选集合元素
CollectionUtils.transform:根据指定方法处理集合元素,类似List的map()
CollectionUtils.filter:过滤元素,雷瑟List的filter()
CollectionUtils.find:基本和select一样
CollectionUtils.collect:和transform 差不多一样,但是返回新数组
CollectionUtils.forAllDo:调用每个元素的指定方法
CollectionUtils.isEqualCollection:判断两个集合是否一致
1.4 org.apache.commons.lang.ArrayUtils
contains:是否包含某字符串
addAll:添加整个数组
clone:克隆一个数组
isEmpty:是否空数组
add:向数组添加元素
subarray:截取数组
indexOf:查找某个元素的下标
isEquals:比较数组是否相等
toObject:基础类型数据数组转换为对应的Object数组
1.5 org.apache.commons.lang3.ArrayUtils
contains:是否包含某个字符串
addAll:添加整个数组
clone:克隆一个数组
isEmpty:是否空数组
add:向数组添加元素
subarray:截取数组
indexOf:查找某个元素的下标
isEquals:比较数组是否相等
toObject:基础类型数据数组转换为对应的Object数组
1.6 com.google.common.collect.Lists
Lists.newArrayList();//创建空集合
Lists.newArrayList(1, 2, 3);//快速初始化集合
Lists.cartesianProduct(list1,list2);//笛卡尔积
Lists.partition(list, 2);//分页,将一个大集合分成若干个小集合
Lists.transform(list, x -> x.toUpperCase());//把某个集合转换成另外一个接口,可以使用Lists的transform方法
Lists.reverse(list);//颠倒顺序
2 文件流工具类
2.1 org.apache.commons.io.IOUtils
closeQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块
toString:读取文件,转换IO流、 Uri、 byte【】为String,例:IOUtils.toString(new FileInputStream("/temp/a.txt"), StandardCharsets.UTF_8);
copy:文件拷贝,IO流数据复制,从输入流写到输出流中,最大支持2GB,例:IOUtils.copy(new FileInputStream("/temp/a.txt"), new FileOutputStream("/temp/b.txt"));
toByteArray:读取文件内容到字节数组,从输入流、URI获取byte【】,IOUtils.toByteArray(new FileInputStream("/temp/a.txt"));
write:写入文件,把字节. 字符等写入输出流,例:IOUtils.write(str, new FileOutputStream("/temp/b.tx"), StandardCharsets.UTF_8);
toInputStream:把字符转换为输入流
readLines:从输入流中读取多行数据,返回List
copyLarge:同copy,支持2GB以上数据的复制
lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部读取,如果数据不够,则失败
其他常用方法:
2.2 org.apache.commons.io.FileUtils
deleteDirectory:删除文件夹
readFileToString:以字符形式读取文件内容
deleteQueitly:删除文件或文件夹且不会抛出异常
copyFile:复制文件
writeStringToFile:把字符写到目标文件,如果文件不存在,则创建
forceMkdir:强制创建文件夹,如果该文件夹父级目录不存在,则创建父级
write:把字符写到指定文件中
listFiles:列举某个目录下的文件(根据过滤器)
copyDirectory:复制文件夹
forceDelete:强制删除文件
2.3 org.apache.commons.io.FilenameUtils
getExtension:返回文件后缀名
getBaseName:返回文件名,不包含后缀名
getName:返回文件全名
concat:按命令行风格组合文件路径(详见方法注释)
removeExtension:删除后缀名
normalize:使路径正常化
wildcardMatch:匹配通配符
seperatorToUnix:路径分隔符改成unix系统格式的,即/
getFullPath:获取文件路径,不包括文件名
isExtension:检查文件后缀名是不是传入参数(List)中的一个
3 字符串工具类
3.1 org.apache.commons.lang.StringUtils
isBlank:字符串是否为空 (trim后判断)
isEmpty:字符串是否为空 (不trim并判断)
equals:字符串是否相等
join:合并数组为单一字符串,可传分隔符
split:分割字符串
EMPTY:返回空字符串
trimToNull:trim后为空字符串则转换为null
replace:替换字符串
3.2 org.apache.commons.lang3.StringUtils
isBlank:字符串是否为空 (trim后判断)
isEmpty:字符串是否为空 (不trim并判断)
equals:字符串是否相等
join:合并数组为单一字符串,可传分隔符,例:StringUtils.join(list, ",")
split:分割字符串,StringUtils.split(str1,",")和str1.split(",")区别:使用StringUtils的split方法会返回null,而使用String的split方法会报指针异常
EMPTY:返回空字符串
replace:替换字符串
capitalize:首字符大写
StringUtils.isNumeric(str1);//判断是否纯数字
3.3 org.springframework.util.StringUtils
hasText:检查字符串中是否包含文本
hasLength:检测字符串是否长度大于0
isEmpty:检测字符串是否为空(若传入为对象,则判断对象是否为null)
commaDelimitedStringToArray:逗号分隔的String转换为数组
collectionToDelimitedString:把集合转为CSV格式字符串
replace 替换字符串
delimitedListToStringArray:相当于split
uncapitalize:首字母小写
collectionToDelimitedCommaString:把集合转为CSV格式字符串
tokenizeToStringArray:和split基本一样,但能自动去掉空白的单词
3.4 org.apache.commons.lang3.StringEscapeUtils(废弃)
unescapeHtml4:转义html
escapeHtml4:反转义html
escapeXml:转义xml
unescapeXml:反转义xml
escapeJava:转义unicode编码
escapeEcmaScript:转义EcmaScript字符
unescapeJava:反转义unicode编码
escapeJson:转义json字符
escapeXml10:转义Xml10
这个现在已经废弃了,建议使用commons-text包里面的方法。
4 对象属性及反射工具类
4.1 java.util.Objects
Objects.isNull(integer);//对象为空
Objects.nonNull(integer);//对象不为空
Objects.requireNonNull(integer1, "参数不能为空");//对象为空抛异常
Objects.equals(integer1, integer2);//判断两个对象是否相等,Objects给我们提供了equals方法
Objects.hashCode(str);//获取对象的hashCode
4.2 org.apache.http.util.EntityUtils
toString:把Entity转换为字符串
consume:确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容,假如用户没有消费,那调用Entity时候将会把它消费掉
toByteArray:把Entity转换为字节流
consumeQuietly:和consume一样,但不抛异常
getContentCharset:获取内容的编码
4.3 org.apache.commons.beanutils.PropertyUtils
getProperty:获取对象属性值
setProperty:设置对象属性值
getPropertyDiscriptor:获取属性描述器
isReadable:检查属性是否可访问
copyProperties:复制属性值,从一个对象到另一个对象
getPropertyDiscriptors:获取所有属性描述器
isWriteable:检查属性是否可写
getPropertyType:获取对象属性类型
4.4 org.apache.commons.beanutils.BeanUtils
copyPeoperties:复制属性值,从一个对象到另一个对象
getProperty:获取对象属性值
setProperty:设置对象属性值
populate:根据Map给属性复制
copyPeoperty:复制单个值,从一个对象到另一个对象
cloneBean:克隆bean实例
4.5 org.springframework.beans.BeanUtils
BeanUtils.copyProperties(user1, user2);//拷贝对象的属性
BeanUtils.instantiateClass(User.class);//实例化某个类
BeanUtils.findDeclaredMethod(User.class, "getId");//获取指定类的指定方法
BeanUtils.findPropertyForMethod(declaredMethod);//获取指定方法的参数
使用例子:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
System.out.println(propertyForMethod.getName())
4.6 org.springframework.util.ClassUtils
ClassUtils.getAllInterfaces(new User());//获取对象的所有接口
ClassUtils.getPackageName(User.class);//获取某个类的包名
ClassUtils.isInnerClass(User.class);//判断某个类是否内部类
ClassUtils.isCglibProxy(new User());//判断对象是否代理对象
4.7 org.springframework.util.ReflectionUtils
Method method = ReflectionUtils.findMethod(User.class, "getId");//获取方法
Field field = ReflectionUtils.findField(User.class, "id");//获取字段
ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);//执行方法
ReflectionUtils.isPublicStaticFinal(field);//判断字段是否常量
ReflectionUtils.isEqualsMethod(method);//判断某个方法是否equals方法
5 网络序列化工具类
5.1 org.apache.http.client.utils.URLEncodedUtils
format:格式化参数,返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串
parse:把String或者URI等转换为List
5.2 org.apache.http.HttpStatus
把常用的http返回码给我们定义好了,直接拿来用就可以了,真的不用再重复定义了(org.springframework.http.HttpStatus也是同样的)
5.3 org.springframework.util.SerializationUtils
有时候,我们需要把数据进行序列化和反序列化处理。传统的做法是某个类实现Serializable接口,然后重新它的writeObject和readObject方法。但如果使用org.springframework.util包下的SerializationUtils工具类,能更轻松实现序列化和反序列化功能。
Map map = Maps.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
byte【】 serialize = SerializationUtils.serialize(map);
Object deserialize = SerializationUtils.deserialize(serialize);
System.out.println(deserialize);
6 加解密工具类
6.1 org.apache.commons.codec.digest.DigestUtils
md5Hex:MD5加密,返回32位字符串,例:DigestUtils.md5Hex("技术");
sha1Hex:SHA-1加密
sha256Hex:SHA-256加密,例:DigestUtils.sha256Hex("技术");
sha512Hex:SHA-512加密
md5:MD5加密,返回16位字符串
6.2 org.springframework.util.Base64Utils
有时候,为了安全考虑,需要将参数只用base64编码。这时就能直接使用org.springframework.util包下的Base64Utils工具类。
它里面包含:encode和decode方法,用于对数据进行加密和解密。例如
String str = "abc";
String encode = new String(Base64Utils.encode(str.getBytes()));
System.out.println("加密后:" + encode);
try {
String decode = new String(Base64Utils.decode(encode.getBytes()), "utf8");
System.out.println("解密后:" + decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
6.3 java.nio.charset.StandardCharsets
我们在做字符转换的时候,经常需要指定字符编码,比如:UTF-8、ISO-8859-1等等。这时就可以直接使用java.nio.charset包下的StandardCharsets类中静态变量。
例如:
String str = "abc";
String encode = new String(Base64Utils.encode(str.getBytes()));
System.out.println("加密后:" + encode);
String decode = new String(Base64Utils.decode(encode.getBytes()), StandardCharsets.UTF_8);
System.out.println("解密后:" + decode);
7 其他工具类
7.1 org.apache.commons.lang3.BooleanUtils
BooleanUtils.isTrue(aBoolean);//判断true
BooleanUtils.isFalse(aBoolean);//判断false
BooleanUtils.isNotTrue(aBoolean);//判断不为true
BooleanUtils.isNotFalse(aBoolean);//判断不为false
BooleanUtils.toInteger(aBoolean);//转换成数字,将true转换成数字1,false转换成数字0
BooleanUtils.toBoolean(aBoolean);//Boolean转换成布尔值,将包装类Boolean对象,转换成原始的boolean对象,可以使用toBoolean方法
7.2 org.springframework.util.Assert
7.2.1 断言参数是否为空
String str = null;
Assert.isNull(str, "str必须为空");
Assert.isNull(//代码效果参考:http://www.zidongmutanji.com/zsjx/174783.html
str, () -> "str必须为空");Assert.notNull(str, "str不能为空");
如果不满足条件就会抛出IllegalArgumentException异常
7.2.2 断言集合是否为空
断言集合是否空,如果不满足条件,则直接抛异常,如果不满足条件就会抛出IllegalArgumentException异常
List list = null;
Map map = null;
Assert.notEmpty(list, "list不能为空");
Assert.notEmpty(list, () -> "list不能为空");
Assert.notEmpty(map, "map不能为空");
7.2.3 断言条件是否为空
断言是否满足某个条件,如果不满足条件,则直接抛异常。
List list = null;
Assert.isTrue(CollectionUtils.isNotEmpty(list), "list不能为空");
Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> "list不能为空");
7.3 org.slf4j.MDC
MDC是org.slf4j包下的一个类,它的全称是Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。
MDC的底层是用了ThreadLocal来保存数据的。我们可以用它传递参数。
例如现在有这样一种场景:我们使用RestTemplate调用远程接口时,有时需要在header中传递信息,比如:traceId,source等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。这种业务场景就能通过ClientHttpRequestInterceptor接口实现,具体做法如下
第一步,定义一个LogFilter拦截所有接口请求,在MDC中设置//代码效果参考:http://www.zidongmutanji.com/zsjx/432645.html
traceId:public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MdcUtil.add(UUID.randomUUID().toString());
System.out.println("记录请求日志");
chain.doFilter(request, response);
System.out.println("记录响应日志");
}
@Override
public void destroy() {
}
}
第二步,实现ClientHttpRequestInterceptor接口,MDC中获取当前请求的traceId,然后设置到header中
public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte【】 body, ClientHttpRequestExecution execution) throws IOException {
//代码效果参考:http://www.zidongmutanji.com/zsjx/436643.html
request.getHeaders().set("traceId", MdcUtil.get());return execution.execute(request, body);
}
}
第三步,定义配置类,配置上面定义的RestTemplateInterceptor类:
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(restTemplateInterceptor()));
return restTemplate;
}
@Bean
public RestTemplateInterceptor restTemplateInterceptor() {
return new RestTemplateInterceptor();
}
}
其中MdcUtil其实是利用MDC工具在ThreadLocal中存储和获取traceId
public class MdcUtil {
private static final String TRACE_ID = "TRACE_ID";
public static String get() {
return MDC.get(TRACE_ID);
}
public static void add(String value) {
MDC.put(TRACE_ID, value);
}
}
能使用MDC保存traceId等参数的根本原因是,用户请求到应用服务器,Tomcat会从线程池中分配一个线程去处理该请求。那么该请求的整个过程中,保存到MDC的ThreadLocal中的参数,也是该线程独享的,所以不会有线程安全问题
————————————————
版权声明:本文为CSDN博主「爱吃牛肉的大老虎」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: