JAVA常用的工具类

news2024/9/27 5:56:31

文章目录

  • 1 集合工具类
    • 1.1 `java.util.``Collections`
      • 1.1.1 基本操作
      • 1.1.2 转换线程安全集合
    • 1.2 org.springframework.util.CollectionUtils
    • 1.3 org.apache.commons.collections.CollectionUtils
    • 1.4 org.apache.commons.lang.ArrayUtils
    • 1.5 org.apache.commons.lang3.ArrayUtils
    • 1.6 com.google.common.collect.Lists
  • 2 文件流工具类
    • 2.1 org.apache.commons.io.IOUtils
    • 2.2 org.apache.commons.io.FileUtils
    • 2.3 org.apache.commons.io.FilenameUtils
    • 2.4 org.springframework.util.FileCopyUtils
    • 2.5 org.springframework.util.ResourceUtils
    • 2.6 org.springframework.util.StreamUtils
  • 3 字符串工具类
    • 3.1 org.apache.commons.lang.StringUtils
    • 3.2 org.apache.commons.lang3.StringUtils
    • 3.3 org.springframework.util.StringUtils
    • 3.4 org.apache.commons.lang3.StringEscapeUtils(废弃)
  • 4 对象属性及反射工具类
    • 4.1 java.util.Objects
    • 4.2 org.apache.http.util.EntityUtils
    • 4.3 org.apache.commons.beanutils.PropertyUtils
    • 4.4 org.apache.commons.beanutils.BeanUtils
    • 4.5 org.springframework.beans.BeanUtils
    • 4.6 org.springframework.util.ClassUtils
    • 4.7 org.springframework.util.ReflectionUtils
    • 4.8 org.springframework.util.**ObjectUtils**
    • 4.9 org.springframework.util.**AopUtils**
    • 4.10 org.springframework.util.**AopContext**
  • 5 网络序列化工具类
    • 5.1 org.apache.http.client.utils.URLEncodedUtils
    • 5.2 org.apache.http.HttpStatus
    • 5.3 org.springframework.util.SerializationUtils
  • 6 加解密工具类
    • 6.1 org.apache.commons.codec.digest.DigestUtils
    • 6.2 org.springframework.util.Base64Utils
    • 6.3 java.nio.charset.StandardCharsets
  • 7 其他工具类
    • 7.1 org.apache.commons.lang3.BooleanUtils
    • 7.2 org.springframework.util.Assert
      • 7.2.1 断言参数是否为空
      • 7.2.2 断言集合是否为空
      • 7.2.3 断言条件是否为空
    • 7.3 org.slf4j.MDC

1 集合工具类

1.1 java.util.``Collections

使用的基本list示意

List<Integer> 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<Integer> list = new ArrayList<>();
  list.add(2);
  list.add(1);
  list.add(3);

  List<Integer> integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
  System.out.println(integers);

它的底层会创建**SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized**加锁

1.2 org.springframework.util.CollectionUtils

集合判断工具

 判断 List/Set 是否为空
boolean isEmpty(Collection<?> collection)
 判断 Map 是否为空
boolean isEmpty(Map<?,?> map)
 判断 List/Set 中是否包含某个对象
boolean containsInstance(Collection<?> collection, Object element)
 以迭代器的方式,判断 List/Set 中是否包含某个对象
boolean contains(Iterator<?> iterator, Object element)
 判断 List/Set 是否包含某些对象中的任意一个
boolean containsAny(Collection<?> source, Collection<?> candidates)
 判断 List/Set 中的每个元素是否唯一。即 List/Set 中不存在重复元素
boolean hasUniqueObject(Collection<?> collection)

集合操作工具

Array 中的元素都添加到 List/Set<E> void mergeArrayIntoCollection(Object array, Collection<E> collection)Properties 中的键值对都添加到 Map<K,V> void mergePropertiesIntoMap(Properties props, Map<K,V> map)
 返回 List 中最后一个元素
<T> T lastElement(List<T> list)  
 返回 Set 中最后一个元素
<T> T lastElement(Set<T> set) 
 返回参数 candidates 中第一个存在于参数 source 中的元素
<E> E findFirstMatch(Collection<?> source, Collection<E> candidates)
 返回 List/Set 中指定类型的元素
<T> T findValueOfType(Collection<?> collection, Class<T> type)
 返回 List/Set 中指定类型的元素。如果第一种类型未找到,则查找第二种类型,以此类推
Object findValueOfType(Collection<?> collection, Class<?>[] types)
 返回 List/Set 中元素的类型
Class<?> findCommonElementType(Collection<?> collection)

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:根据指定方法处理集合元素,类似Listmap()
CollectionUtils.filter:过滤元素,雷瑟Listfilter()
CollectionUtils.find:基本和select一样
CollectionUtils.collect:和transform 差不多一样,但是返回新数组
CollectionUtils.forAllDo:调用每个元素的指定方法

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流、 Uribyte[]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<String>
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<String>)中的一个

2.4 org.springframework.util.FileCopyUtils

输入

 从文件中读入到字节数组中
byte[] copyToByteArray(File in)
 从输入流中读入到字节数组中
byte[] copyToByteArray(InputStream in)
 从输入流中读入到字符串中
String copyToString(Reader in)

输出

 从字节数组到文件
void copy(byte[] in, File out)
 从文件到文件
int copy(File in, File out)
 从字节数组到输出流
void copy(byte[] in, OutputStream out) 
 从输入流到输出流
int copy(InputStream in, OutputStream out) 
 从输入流到输出流
int copy(Reader in, Writer out)
 从字符串到输出流
void copy(String in, Writer out)

2.5 org.springframework.util.ResourceUtils

从资源路径获取文件

 判断字符串是否是一个合法的 URL 字符串。
static boolean isUrl(String resourceLocation)
 获取 URL
static URL getURL(String resourceLocation) 
 获取文件(在 JAR 包内无法正常使用,需要是一个独立的文件)
static File getFile(String resourceLocation)

2.6 org.springframework.util.StreamUtils

输入

void copy(byte[] in, OutputStream out)
int copy(InputStream in, OutputStream out)
void copy(String in, Charset charset, OutputStream out)
long copyRange(InputStream in, OutputStream out, long start, long end)

输出

byte[] copyToByteArray(InputStream in)
String copyToString(InputStream in, Charset charset)
 舍弃输入流中的内容
int drain(InputStream in)

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

字符串判断工具

 判断字符串是否为 null,或 ""。注意,包含空白符的字符串为非空
boolean isEmpty(Object str)
 判断字符串是否是以指定内容结束。忽略大小写
boolean endsWithIgnoreCase(String str, String suffix)
 判断字符串是否已指定内容开头。忽略大小写
boolean startsWithIgnoreCase(String str, String prefix) 
 是否包含空白符
boolean containsWhitespace(String str)
 判断字符串非空且长度不为 0,即,Not Empty
boolean hasLength(CharSequence str)
 判断字符串是否包含实际内容,即非仅包含空白符,也就是 Not Blank
boolean hasText(CharSequence str)
 判断字符串指定索引处是否包含一个子串。
boolean substringMatch(CharSequence str, int index, CharSequence substring)
 计算一个字符串中指定子串的出现次数
int countOccurrencesOf(String str, String sub)

字符串操作工具

 查找并替换指定子串
String replace(String inString, String oldPattern, String newPattern)
 去除尾部的特定字符
String trimTrailingCharacter(String str, char trailingCharacter) 
 去除头部的特定字符
String trimLeadingCharacter(String str, char leadingCharacter)
 去除头部的空白符
String trimLeadingWhitespace(String str)
 去除头部的空白符
String trimTrailingWhitespace(String str)
 去除头部和尾部的空白符
String trimWhitespace(String str)
 删除开头、结尾和中间的空白符
String trimAllWhitespace(String str)
 删除指定子串
String delete(String inString, String pattern)
 删除指定字符(可以是多个)
String deleteAny(String inString, String charsToDelete)
 对数组的每一项执行 trim() 方法
String[] trimArrayElements(String[] array)
 将 URL 字符串进行解码
String uriDecode(String source, Charset charset)
逗号分隔的String转换为数组
commaDelimitedStringToArray
把集合转为CSV格式字符串
collectionToDelimitedString
相当于split
delimitedListToStringArray
首字母小写
uncapitalize
把集合转为CSV格式字符串
collectionToDelimitedCommaString
和split基本一样,但能自动去掉空白的单词
tokenizeToStringArray

路径相关工具方法

 解析路径字符串,优化其中的 “..String cleanPath(String path)
 解析路径字符串,解析出文件名部分
String getFilename(String path)
 解析路径字符串,解析出文件后缀名
String getFilenameExtension(String path)
 比较两个两个字符串,判断是否是同一个路径。会自动处理路径中的 “..boolean pathEquals(String path1, String path2)
 删除文件路径名中的后缀部分
String stripFilenameExtension(String path) 
 以 “. 作为分隔符,获取其最后一部分
String unqualify(String qualifiedName)
 以指定字符作为分隔符,获取其最后一部分
String unqualify(String qualifiedName, char separator)

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

在这里插入图片描述

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 findMethod(Class<?> clazz, String name) 
 同上,额外提供方法参数类型作查找条件
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) 
 获得类中所有方法,包括继承而来的
Method[] getAllDeclaredMethods(Class<?> leafClass) 
 在类中查找指定构造方法
Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes) 
 是否是 equals() 方法
boolean isEqualsMethod(Method method) 
 是否是 hashCode() 方法 
boolean isHashCodeMethod(Method method) 
 是否是 toString() 方法
boolean isToStringMethod(Method method) 
 是否是从 Object 类继承而来的方法
boolean isObjectMethod(Method method) 
 检查一个方法是否声明抛出指定异常
boolean declaresException(Method method, Class<?> exceptionType)

获取字段

 在类中查找指定属性
Field findField(Class<?> clazz, String name) 
 同上,多提供了属性的类型
Field findField(Class<?> clazz, String name, Class<?> type) 
 是否为一个 "public static final" 属性
boolean isPublicStaticFinal(Field field)

设置字段

 获取 target 对象的 field 属性值
Object getField(Field field, Object target) 
 设置 target 对象的 field 属性值,值为 value
void setField(Field field, Object target, Object value) 
 同类对象属性对等赋值
void shallowCopyFieldState(Object src, Object dest)
 取消 Java 的权限控制检查。以便后续读写该私有属性
void makeAccessible(Field field) 
 对类的每个属性执行 callback
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 
 同上,多了个属性过滤功能。
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc,ReflectionUtils.FieldFilter ff) 
 同上,但不包括继承而来的属性
void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)

执行方法

 执行方法
Object invokeMethod(Method method, Object target)  
 同上,提供方法参数
Object invokeMethod(Method method, Object target, Object... args) 
 取消 Java 权限检查。以便后续执行该私有方法
void makeAccessible(Method method) 
 取消 Java 权限检查。以便后续执行私有构造方法
void makeAccessible(Constructor<?> ctor)

4.8 org.springframework.util.ObjectUtils

获取对象的基本信息

 获取对象的类名。参数为 null 时,返回字符串:"null" 
String nullSafeClassName(Object obj)
 参数为 null 时,返回 0
int nullSafeHashCode(Object object)
 参数为 null 时,返回字符串:"null"
String nullSafeToString(boolean[] array)
 获取对象 HashCode(十六进制形式字符串)。参数为 null 时,返回 0 
String getIdentityHexString(Object obj)
 获取对象的类名和 HashCode。参数为 null 时,返回字符串:"" 
String identityToString(Object obj)
 相当于 toString()方法,但参数为 null 时,返回字符串:""
String getDisplayString(Object obj)

判断工具

 判断数组是否为空
boolean isEmpty(Object[] array)

 判断参数对象是否是数组
boolean isArray(Object obj)

 判断数组中是否包含指定元素
boolean containsElement(Object[] array, Object element)

 相等,或同为 null时,返回 true
boolean nullSafeEquals(Object o1, Object o2)

判断参数对象是否为空,判断标准为:
    Optional: Optional.empty()
       Array: length == 0
CharSequence: length == 0
  Collection: Collection.isEmpty()
         Map: Map.isEmpty()

boolean isEmpty(Object obj)

其他工具方法

 向参数数组的末尾追加新元素,并返回一个新数组
<A, O extends A> A[] addObjectToArray(A[] array, O obj)
 原生基础类型数组 --> 包装类数组
Object[] toObjectArray(Object source)

4.9 org.springframework.util.AopUtils

判断代理类型

 判断是不是 Spring 代理对象
boolean isAopProxy()
 判断是不是 jdk 动态代理对象
isJdkDynamicProxy()
 判断是不是 CGLIB 代理对象
boolean isCglibProxy()

获取被代理对象的 class

 获取被代理的目标 class
Class<?> getTargetClass()

4.10 org.springframework.util.AopContext

获取当前对象的代理对象

获取当前对象的代理对象
Object currentProxy()

5 网络序列化工具类

5.1 org.apache.http.client.utils.URLEncodedUtils

format:格式化参数,返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串
parse:把String或者URI等转换为List<NameValuePair>

5.2 org.apache.http.HttpStatus

把常用的http返回码给我们定义好了,直接拿来用就可以了,真的不用再重复定义了(org.springframework.http.HttpStatus也是同样的)
在这里插入图片描述

5.3 org.springframework.util.SerializationUtils

有时候,我们需要把数据进行**序列化反序列化处理。传统的做法是某个类实现Serializable接口,然后重新它的writeObjectreadObject**方法。但如果使用org.springframework.util包下的SerializationUtils工具类,能更轻松实现序列化和反序列化功能。

Map<String, String> 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位字符串

img

6.2 org.springframework.util.Base64Utils

有时候,为了安全考虑,需要将参数只用**base64**编码。这时就能直接使用org.springframework.util包下的Base64Utils工具类。

它里面包含:encodedecode方法,用于对数据进行加密和解密。例如

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方法

img

7.2 org.springframework.util.Assert

7.2.1 断言参数是否为空

String str = null;
Assert.isNull(str, "str必须为空");
Assert.isNull(str, () -> "str必须为空");
Assert.notNull(str, "str不能为空");

如果不满足条件就会抛出IllegalArgumentException异常

7.2.2 断言集合是否为空

断言集合是否空,如果不满足条件,则直接抛异常,如果不满足条件就会抛出IllegalArgumentException异常

List<String> list = null;
Map<String, String> map = null;
Assert.notEmpty(list, "list不能为空");
Assert.notEmpty(list, () -> "list不能为空");
Assert.notEmpty(map, "map不能为空");

7.2.3 断言条件是否为空

断言是否满足某个条件,如果不满足条件,则直接抛异常。

List<String> list = null;
Assert.isTrue(CollectionUtils.isNotEmpty(list), "list不能为空");
Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> "list不能为空");

7.3 org.slf4j.MDC

MDCorg.slf4j包下的一个类,它的全称是Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。

MDC的底层是用了**ThreadLocal**来保存数据的。我们可以用它传递参数。

例如现在有这样一种场景:我们使用**RestTemplate**调用远程接口时,有时需要在header中传递信息,比如:traceId,source等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。这种业务场景就能通过ClientHttpRequestInterceptor接口实现,具体做法如下

第一步,定义一个LogFilter拦截所有接口请求,在MDC中设置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 {
        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中的参数,也是该线程独享的,所以不会有线程安全问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java] 中的具体集合

文章目录 集合根接口List列表&#xff08;线性表&#xff09;Queue & Deque双端队列 Set集合HashSet源码应用 TreeSet源码 Map映射Map的底层实现HashMapLinkedHashMapTreeMap Maps methodcompute()merge()replace()remove() Stream流Collections工具类 集合表示一组对象&am…

Reactor 第九篇 WebFlux重构个人中心,效果显著

1 重构背景 原有的开发人员早已离职&#xff0c;代码细节没人知道&#xff0c;经过了一段时间的维护&#xff0c;发现有以下问题&#xff1a; 个人中心系统的特征就是组装各个业务的接口&#xff0c;输出个人中心业务需要的数据&#xff0c;整个系统调用了几十个第三方业务线的…

moment在vue的使用

第一步&#xff1a;安装moment npm install moment --save-dev第二步&#xff1a;在使用moment的地方引入moment import moment from "moment"; monent的方法&#xff1a; &#xff08;1&#xff09;moment([日期])&#xff1a; 获取当前日期或指定日期&#xff…

pytorch学习率设置——optimizer.param_groups、对不同层设置学习率、动态调整学习率。

文章目录 前言1、关于optimizer.param_groups2、设置学习率3、optim 提供的优化器 前言 我的需求&#xff1a;我需要在yolov7中更改其中一层的学习率&#xff0c;但yolov7的学习率是随着eporch的变化动态变化的。 1、关于optimizer.param_groups “param_groups” 是 Pytorch…

LeetCode1047. 删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…

RabbitMQ 工作队列模型(任务队列)

任务模型 概念 ​ 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度大于消费的速度&#xff0c;长此以往&#xff0c;就会导致消息堆积&#xff0c;无法及时处理&#xff0c;此时可以使用任务模型&#xff0c;当多个消费者绑定一个队列&#xff0c;共同消费其中的消息…

认识JSP

什么是JSP? JSP&#xff08;Java Server Pages&#xff09;是一种类似于HTML的标记语言&#xff0c;用于创建动态Web页面。与HTML不同的是&#xff0c;JSP页面中可以嵌入Java代码&#xff0c;由Web服务器在动态页面中生成HTML代码&#xff0c;从而实现Web应用程序的前端交互效…

scratch求和 中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析2023年3月

目录 scratch求和 一、题目要求 1、准备工作 2、功能实现 二、案例分析

node之Express

目录 Express简介 安装 创建基本的Web服务器 托管静态资源 以上述案例为基础访问静态资源的路径为&#xff1a;http://127.0.0.1:8080/xxx.html 托管多个静态资源目录 路由的概念 路由的匹配过程 模块化路由 模块化路由案例 中间件的概念 定义中间件函数例 全局生…

AI助阵,领先创新丨智能评价分析·数字员工,开启顶级消费者体验新篇章!

GPT-4作为人工智能时代发展道路上的里程碑&#xff0c;以其惊人的多模态大模型能力吸引了众多零售消费品牌的关注&#xff0c;利用AI技术解决客户复杂业务问题&#xff0c;成为推动行业提质增效的重要途径。实在智能是国内首个生成式AI标准编写单位&#xff0c;始终坚持AI赋能商…

各种常用字符编码详解【图文教程】,Unicode 是一个编码规范,并不是一个具体的编码

文章目录 常见编码的比较&#xff0c;各个编码中各字符占用(字节数):简体中文编码发展史&#xff0c;编码出现时间和涵盖范围UTF-8、unicode与GBK编码转化一问一答其他ASCII表 参考文档 常见编码的比较&#xff0c;各个编码中各字符占用(字节数): 编码英文中文&#xff08;简体…

数说热点 | 跟着《长月烬明》起飞,今年各地文旅主打的就是一个听劝

近日&#xff0c;随着热播剧《长月烬明》的爆火&#xff0c;蚌埠、宣城、敦煌等多个与剧情梦幻联动的宝藏城市被带飞&#xff0c;各地热心网友也纷纷催促自家文旅局赶紧“蹭飞”&#xff0c;《长月烬明》以一己之力打造了影视文旅融合的新样板。 仙偶剧特效天花板&#xff0c;…

SpringCloud------代码demo(二)

SpringCloud------代码demo&#xff08;二&#xff09; 编码实操 以订单——支付微服务模块作为基础&#xff0c;开始逐渐扩充 微服务架构编码构建 1.约定 > 配置 > 编码 2.IDEA新建project工作空间 3.Rest微服务工程构建 总父工程 POM project module 首先创建maven项…

FPGA入门系列14--VGA

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

06 - 3 事件驱动架构模式——EDA

何为EDA 事件驱动架构是一种异步分发事件的架构模式用于高扩展且低耦合的系统以事件为核心&#xff0c;一系列解耦的、单一功能的事件处理器 Notification 源系统发送消息通知其他系统状态改变接收方响应非必须发送 Event 逻辑与处理 Event 逻辑无依赖&#xff0c;独立变化解…

华为路由WS5200 四核版使用体验

文章目录 前言一、主界面和上网设置二、网络WIFI设置三、安全和系统总结 前言 其实我是看不上这种除了能上网&#xff0c;没任何用的东东的。除了上古时代用过类似的简单设备&#xff0c;已经十数年没再看一眼这种东西了&#xff0c;当然更不会去买这种东西&#xff0c;别误会…

vscode配置latex

reference&#xff1a;https://zhuanlan.zhihu.com/p/166523064 1 texlive卸载 找到texlive\2019\tlpkg\installer下的uninst.bat文件并点击运行。 删除环境变量 2 texlive安装 打开https://tug.org/texlive/acquire-iso.html点击下载iso文件 3 vscode 安装 4 latex插件…

Linux系统编程 多线程基础

文章目录 前言一、线程概念二、线程的创建三、线程的退出四、pthread_join函数总结 前言 本篇文章作为多线程的入门讲解将带大家先创建几个线程来感受一下什么是多线程&#xff0c;了解一下多线程到底有什么作用。 一、线程概念 线程&#xff08;Thread&#xff09;是程序执…

C++类与对象(二)——构造函数与析构函数

文章目录 一.类的默认6个成员函数二.构造函数1.引例2.构造函数的概念及特性 三.析构函数&#x1f60b;析构函数的特性 前言&#xff1a; 上篇文章初步认识了类以及类的相关知识&#xff0c;本篇将继续深入学习类与对象——类的默认6个成员函数&#xff1a; 一.类的默认6个成员函…

制造企业如何跨越大规模定制鸿沟?中国最大减速机企业的答案来了

导读&#xff1a;传统制造企业如何深度用云&#xff1f; 在中国制造向中国智造的转型中&#xff0c;长三角地区一直扮演着急先锋的角色。总部位于常州的江苏国茂减速机股份有限公司(简称国茂股份)&#xff0c;就是中国制造上云转型的典型代表。 国茂股份成立于1993年&#xff0…