Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要但JDK没能提供的机能,最大化的减少重复代码的编写。
org.apache.commons.lang3 为加强版的 org.apache.commons.lang 功能更加丰富
Integer.toBinaryString(int i) 将指定数字转成二进制string类型,同理其他类型也有这个方法
一. org.apache.commons.lang3.StringUtils isBlank 字符串是否为空 (trim后判断) 实际应用多 isEmpty 字符串是否为空 (不trim后判断) equals(String str1,String str2) 字符串是否相等 startWith(String prefix,int toffset) 前缀,字符串开始查找的位置 join(final Iterable<?> iterable, final char separator) 将集合中的元素,以指定的连接符连接 StringUtils.join(collection, ","); join(final T... elements) 将若干个元素组成一个字符串 StringUtils.join(1, "-", 2) //和下面实现同样功能: StringTokenizer stringTokenizer = new StringTokenizer(bitCodeStr, ","); do{result.add(stringTokenizer.nextToken());} while(stringTokenizer.hasMoreElements()); split(String str) 分割字符串成数组 StringUtils.EMPTY 返回空字符串 StringUtils.defaultIfEmpty("你好",""); //str == null或者为空返回默认值 StringUtils.defaultString("你好",""); //str == null返回默认值 StringUtils.INDEX_NOT_FOUND; -1常量 //替换多个字符串,替换字符串和搜索字符串需要一一对应 StringUtils.replaceEach(originDocUri, new String[]{NetSchoolServiceConstants.HTTP_SCHEMA, NetSchoolServiceConstants.HTTPS_SCHEMA}, new String[]{"",""}) trimToNull 去掉字符串两端的控制符(control characters, char <= 32) ,如果变为 null 或"",则返回 null replacePattern(String source,String regex,String replacement) 正则替换字符串 eg: replacePattern("11k","\\D+","") 正则表达式生成网址https://www.sojson.com/regex/generate leftpad(String str,int size,String padStr) str以padStr补全到长度为size大小 lastIndexOf(String str, char searchChar) 补充: org.apache.commons.lang.StringEscapeUtils.unescapeHtml4(String input) 前端传值到后台会将一些特殊符号转义, 通过这个方法java转义成正常
二. org.apache.commons.lang3.ArrayUtils isEmpty 是否空数组 contains 是否包含某字符串 addAll 合并两个数组 remove 删除数组某个位置的元素 Object[] clone(Object[] array) 克隆一个数组 isSameLength(strs, strs2)判断两个数组长度是否相等,两数组类型必须相同 add 向数组添加元素 subarray 截取数组 lastIndexOf(Object[] array, Object objectToFind) 查找元素最后一次存在位置 reverse 反转数组 isEquals 比较数组是否相等 toObject 基础类型数据数组转换为对应的Object数组 三. org.apache.commons.collections.CollectionUtils isEmpty 集合是否为空 isNotEmpty 集合是否不为空 select 根据条件筛选集合元素 transform 根据指定方法处理集合元素,类似List的map()。 filter 过滤元素,雷瑟List的filter() find 基本和select一样 collect 和transform 差不多一样,但是返回新数组 forAllDo 调用每个元素的指定方法。 isEqualCollection 判断两个集合是否一致 CollectionUtils.union( Collection a, Collection b ) 求两集合并集 CollectionUtils.intersection(Collection a, Collection b) 求两集合交集 CollectionUtils.subtract(Collection a, Collection b ) 求两集合差集 CollectionUtils.containsAny(aList, bList); 是否存在交集 unmodifiableCollection 可以得到一个集合的镜像,它的返回结果是不可直接被改变,否则会提示错误 com.google.common.collect.Lists.partition(docs, 100), list分组 三(1) org.apache.commons.collections4.MapUtils MapUtils.isEmpty map是否为空(底层其实就是map == null || map.isEmpty()) 四.Arrays jdk1.7以上自带 //(不允许操作 否则报错java.lang.UnsupportedOperationException) 可以new Arraylist(转换后的数据) List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表 binarySearch(object[ ], object key) 二分查找 <T> void sort(T[] a, Comparator<? super T> c) 数组排序 String toString(Object[] a) 方便打印出一维数组内容 (StringUtils.join方法可转成字符串) deepToString 方便打印出二维数组内容 equals方法 比较1维数组是否相等 deepEquals方法 可去判断更加复杂的数组是否相等 fill(obj[] a, obj val) 填充数组元素 五.Collections jdk1.7以上自带 reverse(List<?> list):反转指定List集合中元素的顺序 sort(List list, Comparator c):自定义比较器进行排序 binarySearch(List list, Object key):使用二分搜索法 fill(List list, Object obj):使用指定对象填充 replaceAll(List list, Object old, Object new):替换 <T> Set<T> synchronizedSet(Set<T> s)返回指定 set 支持的同步(线程安全的)set <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)返回指定有序 set 支持的同步(线程安全的)有序 set <T> List<T> synchronizedList(List<T> list) 返回指定列表支持的同步(线程安全的)列表 <K,V> Map<K,V> synchronizedMap(Map<K,V> m)返回由指定映射支持的同步(线程安全的)映射 <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)返回指定有序映射支持的同步(线程安全的)有序映射 //(集合的长度必须一致) ArrayList<String> arrayList = new ArrayList<>(Arrays.asList( new String[目标集合.size()] )); copy(List<? super Object> dest, List<? extends Object> src) 复制集合 unmodifiableCollection( Collection c ) 可以得到一个集合的镜像,它的返回结果是不可直接被改变,否则会提示错误 六.org.apache.commons.beanutils.BeanUtils(因为Apache BeanUtils力求做得完美, 在代码中增加了非常多的校验、兼容、日志打印等代码,过度的包装导致性能下降严重 不推荐使用性能较差,推荐spring Beanutils或cglib Beancopier) copyPeoperties(Object dest, Object orig) 复制属性值,从一个对象到另一个对象 getProperty/getSimpleProperty(Object bean, String name) 获取对象属性值 setProperty(Object bean, String name, Object value) 设置对象属性值 populate(Object bean,Map<String,? extends Object> properties) 根据Map给属性复制 copyProperty(Object bean, String name, Object value) 复制单个值,从一个对象到另一个对象。 cloneBean(Object bean) 克隆 注意: copyPeoperties方法中,如果对象的属性有list那么复制的时候,目标对象的list元素还是原始对象list中的元素 补充: final BeanCopier beanCopier = BeanCopier.create(A.class, B.class, false); beanCopier.copy(first,second,null);
为什么不推荐使用BeanUtils属性转换工具 几种拷贝属性方式详解七.org.apache.commons.beanutils.PropertyUtils getProperty 获取对象属性值 setProperty 设置对象属性值 getPropertyDiscriptor 获取属性描述器 isReadable 检查属性是否可访问 copyProperties 复制属性值,从一个对象到另一个对象 getPropertyDiscriptors 获取所有属性描述器 isWriteable 检查属性是否可写 getPropertyType 获取对象属性类型 copyProperties(Object dest, Object orig); 复制属性 八.org.apache.commons.lang.time.DateUtils(常用的一些函数)Date addDays(Date date,int amount) 一个日期对象n天(n可以时候正负数) 返回一个新对象 Date addHours(Date date,int amount)//一个日期对象+n小时 返回一个新对象 Date addMilliseconds(Date date,int amount) //一个日期对象+n毫秒 返回一个新对象 Date addMinutes(Date date,int amount)//一个日期对象+n分 返回一个新对象 Date addMonths(Date date,int amount) //一个日期对象+n月 返回一个新对象 Date addSeconds(Date date,int amount) //一个日期对象+n秒 返回一个新对象 Date addWeeks(Date date,int amount) //一个日期对象+N个星期 Date addYears(Date date,int amount) //一个日期对象+N年 boolean isSameDay(Date date1,Date date2) //两个日期对象是否相等(只比较年-月-日) boolean isSameInstant(Date date1,Date date2) //比较两个日期是否完全相等(精确到毫秒) Date parseDate(String str,String[] parsePatterns) Parses a string representing a date by trying a variety of different parsers
会将2022-04-011转化成2022-04-01 Date parseDateStrictly(String str, String[] parsePatterns) 会将2022-04-33转化成2022-05-03 parseDate(String str, String[] parsePatterns)
当使用DateUtils
类的parseDateStrictly()
方法解析日期时,如果日期字符串无法匹配指定格式,则该方法会抛出异常。但是,如果使用DateUtils
类的parseDate()/parseDateStrictly()
方法解析日期时,将忽略无效的日期部分,例如 2022-04-011转化成2022-04-01
推荐使用 LocalDate.parse("2020-01-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//计算相差天数(忽略时分秒) 如果endDate<startDate, 返回负数???
public static long getDays(Date startTime, Date endTime) {
Calendar c1=Calendar.getInstance();
//c1.set(year1,month1,date1);
c1.setTime(startTime);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.SECOND, 0);
c1.set(Calendar.MILLISECOND, 0);
Calendar c2=Calendar.getInstance();
//c2.set(year1,month1,date1);
c2.setTime(endTime);
c2.set(Calendar.MINUTE, 0);
c2.set(Calendar.SECOND, 0);
c2.set(Calendar.MILLISECOND, 0);
long diffInMilliseconds = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return TimeUnit.DAYS.convert(diffInMilliseconds, TimeUnit.MILLISECONDS);
}
/**
* 计算两个时间相差的天数/分钟数
* @param startDate 起始时间(较小)
* @param endDate 结束时间(较大)
* @return 相差天数
*/
public static String daysOrMinuteBetween(Date startDate, Date endDate) {
endDate= (endDate==null)?new Date():endDate;
long durationMillis = endDate.getTime() - startDate.getTime();
// 将毫秒转换为天、小时和分钟
long days = TimeUnit.MILLISECONDS.toDays(durationMillis);
long hours = TimeUnit.MILLISECONDS.toHours(durationMillis) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(durationMillis) % 60;
StringBuilder sb = new StringBuilder();
if (days > 0) {
sb.append(days).append("天");
}
if (hours > 0) {
sb.append(hours).append("小时");
}
if (minutes > 0) {
sb.append(minutes).append("分钟");
}
return sb.toString();
}
/**
* 是否是今天/往后的时间(忽略时分秒)
* @param date
* @return
*/
public static boolean isSameOrAfterDay(Date date){
if (date == null) {
return Boolean.FALSE;
}
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date);
Calendar todayCalendar = Calendar.getInstance();
todayCalendar.setTime(new Date());
return (cal1.get(Calendar.ERA) > todayCalendar.get(Calendar.ERA) ||
cal1.get(Calendar.YEAR) > todayCalendar.get(Calendar.YEAR) ||
cal1.get(Calendar.DAY_OF_YEAR) >= todayCalendar.get(Calendar.DAY_OF_YEAR));
}
//指定时间格式, 日期加减天数
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,-1); // 昨天
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Date time = calendar.getTime();
//String format = DateFormatUtils.format(time, FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss").getPattern())
String format = DateFormatUtils.format(time, "yyyy-MM-dd HH:mm:ss");
System.out.println(format);
//方式1: 计算相差的天数
//计算相差的天数,支持跨年!!!!! 推荐!!!!!!
public static long daysBetween(Date startDate, Date endDate) {
long diff = endDate.getTime() - startDate.getTime();
return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
}
//方式2: 计算相差的天数(不推荐)
LocalDate start = LocalDate.of(2022, 4, 19);
LocalDate end = LocalDate.of(2022, 12, 31);
//同年-计算相差的天数, 不同年的需要手动加
int dayOfYear = start.getDayOfYear();
int dayOfYear1 = end.getDayOfYear();
DateFormatUtils 格式化时间工具类 java.util.concurrent.TimeUnit#SECONDS.toMillis() 秒和毫秒值转换工具
请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!九.org.apache.commons.lang3.ObjectUtils(是java.util.Objects的升级版 推荐使用) //
//已作废,lang.ObjectUtils未作废(底层调用 Object1.equals(object2) 还是调用类中的equals方法,如果类型不同返回false)boolean equals(Object object1, Object object2)java.util.Objects.equals(Object a, Object b) String toString(Object obj) Object defaultIfNull(Object object, Object defaultValue) 推荐使用,可以定义各种类型默认值 十org.apache.commons.lang3.BooleanUtils 操作基础布尔或者布尔对象 http://blog.csdn.net/huangwenyi1010/article/details/52263957 参照 boolean isTrue(Boolean bool) boolean isNotTrue(Boolean bool) boolean isFalse(Boolean bool) boolean isNotFalse(Boolean bool) 基本数据类型与封装类型转换 boolean toBoolean(Boolean bool)//封装类型转换为基础类型 toBooleanDefaultIfNull(Boolean bool,boolean valueIfNull) toBoolean(int value) //0为false ,非0为true null为null toBooleanObject(int value) Boolean toBooleanObject(Integer value) toBoolean(int value,int trueValue,int falseValue) toBooleanObject(int value,int trueValue,int falseValue,int nullValue) int compare(boolean x,boolean y) 相等 返回0 不能返回1 转换为整形 int toInteger(boolean bool)//false是0,true是1 Integer toIntegerObject(boolean bool) int toInteger(boolean bool,int trueValue,int falseValue)等等 int toInteger(Boolean bool,int trueValue,int falseValue,int nullValue)等等 转化为字符串 String toStringTrueFalse(boolean bool) String toStringYesNo(boolean bool) String toStringOnOff(boolean bool) String toString(Boolean bool,String trueString,String falseString,String nullString) 十一.org.apache.commons.lang3.ClassUtils getShortClassName(Class cls)取得一个类的类名 ClassUtils.getPackageName(Class cls) 获取一个类的包名 十一. org.springframework.util.ReflectionUtils 反射类 十二. org.apache.commons.io.FileUtils deleteDirectory 删除文件夹 readFileToString 以字符形式读取文件内容。 deleteQueitly 删除文件或文件夹且不会抛出异常。 copyFile 复制文件 writeStringToFile 把字符写到目标文件,如果文件不存在,则创建。 forceMkdir 强制创建文件夹,如果该文件夹父级目录不存在,则创建父级。 write 把字符写到指定文件中 listFiles 列举某个目录下的文件(根据过滤器) copyDirectory 复制文件夹 forceDelete 强制删除文件 //普通文件构造成MultipartFile对象 File file = new File("/Users/brucelee/soft/project/zpqa-consistency-api/PFMEA.xlsx"); byte[] bytes = Files.readAllBytes(file.toPath()); FileItem fileItem = new DiskFileItemFactory().createItem( "file", Files.probeContentType(file.toPath()), false, file.getName() ); fileItem.getOutputStream().write(bytes); MultipartFile file= new CommonsMultipartFile(fileItem); 十三. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不抛出异常。通常放在finally块。 toString 转换IO流、 Uri、 byte[]为String。 copy IO流数据复制,从输入流写到输出流中,最大支持2GB。 toByteArray 从输入流、URI获取byte[]。 write 把字节. 字符等写入输出流。 toInputStream 把字符转换为输入流。 readLines 从输入流中读取多行数据,返回List<String> copyLarge 同copy,支持2GB以上数据的复制。 lineIterator 从输入流返回一个迭代器, 根据参数要求读取的数据量,全部读取,如果数据不够,则失败。 ( java.io.FileNotFoundException:文件名、目录名或卷标语法不正确 文件名或文件夹名中不能出现以下字符:\ / : * ? " < > | ) 十四. org.apache.commons.codec.digest.DigestUtils md5Hex MD5加密,返回32位 sha1Hex SHA-1加密 sha256Hex SHA-256加密 sha512Hex SHA-512加密 md5 MD5加密,返回16位 十五. org.springframework.util.DigestUtils spring框架自带的md5加密工具类 MD5 不能解密, MD5的破解方式就是 把不同的字符串按MD5加密 然后对比加密后的结果是不是一样. 在线MD5解密 也是这样的原理. 在线破译网站地址: https://www.cmd5.com 加密的长度是固定的32位举例: private String getMD5(long seckillId) { String base = seckillId + "/" + salt; //salt md5盐值字符串 用于混淆md5 String md5 = DigestUtils.md5DigestAsHex(base.getBytes()); return md5; } 十六: guava类库提供的方法 com.google.common.collect.Lists.newArrayList() 新建空list com.google.common.collect.Maps.newHashMap() 新建空map 十七: hutool类库的方法 HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull( RequestContextHolder.getRequestAttributes())).getRequest(); ServletUtil.getClientIP(request) 获取请求ip URLUtil.getPath(request.getRequestURI() 获得取path部分 Validator.isMobile()手机号 Validator.isCitizenId() 校验身份证 StrUtil.C_COLON 冒号 e.getLocalizedMessage() 获取异常信息 常用的变量 BigDecimal.ZERO.intValue(); BigDecimal.ZERO.doubleValue();
StandardCharsets.UTF_8.name() 字符集常量
java.util.Collections.emptyList() 新建空list
java.util.Collections.emptyMap() 新建空map
java.util.Collections.emptySet() 新建空set
静态数据初始化map,外层的一组“{}”表示的是一个匿名类,内层的一对“{}”表示的是实例初始化块,然后这边还有一点需要明白,实例初始化块的代码在编译器编译过后,是放在类的构造函数里面的,并且是在原构造函数代码的前面
private HashMap<Integer, String> subjectServiceMap = new HashMap<Integer, String>() {
{
put(ResourceTypeEnum.VIDEO_PACKAGE.getValue(), "videoResourceService");
put(ResourceTypeEnum.VIDEO.getValue(), "lessonResourceService");
put(ResourceTypeEnum.EXAM_PAPER.getValue(), "paperResourceService");
put(ResourceTypeEnum.XB_VIDEO.getValue(), "schoolVideoResourceService");
put(ResourceTypeEnum.XB_PAPER.getValue(), "schoolPaperResourceService");
}
};
private static SortedMap<Integer, String> sortedMap = new TreeMap<>();
//获取key大于hash值的所有keys
SortedMap<Integer, String> subMap = sortedMap.tailMap(hash);
//第一个key
subMap.firstKey()
注意: String.concat(String str) 当str==null 会导致空指针
两个BigDecimal值比较是否相等, 使用 compareTo比较是否等于0,使用equals是错误的
//list转数组 Arrays.stream(MisplacedTypeEnum.values()).map(e -> e.getDesc()).toArray(String[]::new);//读取yml文件, 最后文件以kv形式存在 Reader reader = Resources.getResourceAsReader("application.yml"); Map map = (Map) new Yaml().load(reader);