目录
jdk自带的Objects
equals、hash、toString
//兼容为null的情况,return (a == b) || (a != null && a.equals(b));
boolean equals = Objects.equals(obj1, obj2);
//深层次的equals,兼容obj为null的情况,数组类型会逐个元素比较,嵌套的数组会递归比较,其它类型用equals进行比较
//集合自身重写了equals(),也会逐个元素比较,嵌套的集合会递归比较
boolean deepEquals = Objects.deepEquals(obj1, obj2);
//计算obj的hashCode,兼容obj为null return o != null ? o.hashCode() : 0;
int hashCode = Objects.hashCode(obj);
//计算数组、多个元素的hashCode。可以把一个对象的多个字段作为传入,以计算该对象的hashCode
int hashCode = Objects.hash(obj...);
//实质是调用String.valueOf(obj),obj==null是返回"null",否则返回obj.toString(),相比于obj.toString() 避免了NPE
String str = Objects.toString(obj);
//obj为null时返回默认值
String str = Objects.toString(obj, String nullDefault);
null、nonNull 检测、校验
//是否为null、非null
boolean isNull = Objects.isNull(obj);
boolean nonNull = Objects.nonNull(obj);
//为null时抛出NPE,不为null是返回参数本身
T t = Objects.requireNonNull(T obj);
//自定义NPE的msg,可以直接用String指定,也可以实现 Supplier<String> 来指定
T t = Objects.requireNonNull(T obj, String msg);
T t = Objects.requireNonNull(T obj, () -> "xxx");
commons-lang3的ObjectUtils
空、非空判断、处理
//静态内部类 Null 的实例
ObjectUtils.Null aNull = ObjectUtils.NULL;
//判断对象是否为空,①先使用==null判断,②如果不为null,字符串会检查字符串长度是否为0,数组、集合会检查元素数量是否为0
boolean isEmpty = ObjectUtils.isEmpty(Object obj);
boolean isNotEmpty = ObjectUtils.isNotEmpty(Object obj);
//是否都为null
//都为null、obj...自身为null或空数组,返回true,其它情况返回false
boolean allNull = ObjectUtils.allNull(obj...);
//是否都不为null
//都不为null或obj...自身是空数组(不为null、只是其中没有元素),返回true;其中一个为null或obj...自身为null,返回false
boolean allNotNull = ObjectUtils.allNotNull(obj...);
//是否有一些为null
//一些元素为null或obj...自身为null,返回true,其它情况返回false
boolean anyNull = ObjectUtils.anyNull(obj...);
//是否有一些不为null
//都为null、obj自身为null或空,返回false,其它情况返回true
boolean anyNotNull = ObjectUtils.anyNotNull(obj...);
//校验obj是否为空。如果obj为null,抛出NPE;如果obj是空串|空数组|空集合,抛出 IllegalArgumentException
T requireNonEmpty = ObjectUtils.requireNonEmpty(T obj);
T requireNonEmpty = ObjectUtils.requireNonEmpty(T obj, "obj不能为空");
//obj为null时返回默认值
T defaultIfNull = ObjectUtils.defaultIfNull(T obj, T defaultValue);
//默认值可以使用Supplier来指定
T getIfNull = ObjectUtils.getIfNull(T obj, Supplier<T> defaultSupplier);
//获取第一个非null的值
T firstNonNull = ObjectUtils.firstNonNull(T... values);
//元素可以使用 Supplier 的形式指定。依次执行 Supplier.get(),遇到第一个非nul的返回值则返回
T getFirstNonNull = ObjectUtils.getFirstNonNull(Supplier<T>... suppliers);
equals、wait、clone
//判断2个对象是否不相等
boolean notEqual = ObjectUtils.notEqual(Object obj1, Object obj2);
//调用Object.wait(),避免了NPE
ObjectUtils.wait(obj, Duration.ofSeconds(30));
//clone对象,需要实现Cloneable接口,实质是调用对象的clone()方法。如果未实现Cloneable接口或参数为null,则直接返回null
//此方法可以用于clone数组,T可以是数组类型
T clone = ObjectUtils.clone(T obj);
//可以clone时才clone,返回clone得到的对象;如果是未实现Cloneable接口或参数为null这种不可clone的,则直接返回原对象(入参)
T cloneIfPossible = ObjectUtils.cloneIfPossible(T obj);
compare、max|min、median中位元素、mode出现最频繁的元素
//比较2个同类型的对象,T需要继承Comparable接口,实现compareTo()方法
//①先调用==直接比较是否相等,②判断其中是否有为null的值,null小于非null,③调用对象自身的compareTo()进行比较
int compare = ObjectUtils.compare(T obj1, T obj2);
//可以指定存在为null的参数时的判断方式,null是否大于非null
int compare = ObjectUtils.compare(T obj1, T obj2, true);
//获取最值。实质是通过 Comparable.compareTo() 进行比较,T需要继承实现Comparable接口
T max = ObjectUtils.max(T... values);
T min = ObjectUtils.min(T... values);
//获取中位元素(中间位置上的元素),如果元素数量为奇数,取(元素数量-1)/2 位置上的元素,eg. 5个元素 => 取第2个元素
//T需要继承实现Comparable接口
T median = ObjectUtils.median(T... items);
//Comparable接口也可以写成参数形式,T无需继承实现Comparable接口
T median = ObjectUtils.median(Comparator<T> comparator, T... items);
//获取出现次数最多的元素。如果有多种元素的出现次数都是最多的、无法区分,则返回null
//eg. 1,2,2,3,4 => 2 1,2,2,3,3,4 => null
T median = ObjectUtils.mode(T... items);
spring的ObjectUtils
//往数组末尾添加一个元素。开辟新数组,复制元素,添加到新数组末尾,返回新数组,原数组不变
T[] arr = ObjectUtils.addObjectToArray(T[], T ele);
//判断是否为数组类型
boolean array = ObjectUtils.isArray(Object obj);
//数组中是否包含指定元素
boolean containsElement = ObjectUtils.containsElement(Object[] arr, Object obj);
//是否为空,字符串、数组、集合会检查元素数量是否为0
boolean isEmpty = ObjectUtils.isEmpty(Object obj);
//直接判断数组是否为空
boolean isEmpty = ObjectUtils.isEmpty(Object[] arr);