检查 Java 对象是否为 Collection、Array 或 String 且为空
Check if Java object is Collection, Array or String and empty
我正在尝试重构时得到了这个方法。
public static boolean isEmpty(Object value) {
boolean empty = false;
if (value instanceof String && ((String) value).isEmpty()) {
empty = true;
} else if (value instanceof List && ((List<?>) value).isEmpty()) {
empty = true;
} else if (value instanceof String[] && ArrayUtils.isEmpty((String[]) value)) {
empty = true;
} else if (value == null) {
empty = true;
}
return empty;
}
是否有我缺少的明显更好的方法?
我知道我可以使用链式 ||
语句将所有条件放在一个 if
语句中,但我真的不明白这比我现在得到的更好。
您可以通过省略标志并直接返回空检查结果来缩短此代码:
public static boolean isEmpty(Object value) {
if (value instanceof String) {
return ((String) value).isEmpty();
} else if (value instanceof List) {
return ((List<?>) value).isEmpty();
} else if (value instanceof String[]) {
return ArrayUtils.isEmpty((String[]) value);
} else {
return value == null;
}
}
这也算是提高了可读性。
Java 本机实用程序使您能够检查 Objects.isNull(value)
是否 not 等同于空。如果您想坚持使用原生 Java,那么您做对了,只需美化您的代码即可。
然而这个方法存在于springFramework ObjectUtils
class 无论对象类型如何:
import org.springframework.util.ObjectUtils;
public static boolean isEmpty(Object value) {
boolean empty = false;
if (ObjectUtils.isEmpty(value)) {
empty= true
}
return empty;
}
Spring 框架文档:Class ObjectUtils
如 中所述,可以使用 if-return
组合改进代码。
然而,您应该更概括您的代码,例如支持所有数组类型,而不仅仅是字符串数组,支持所有集合类型,而不仅仅是列表。
同样,String
实现了一个名为 CharSequence
的接口,因此请支持它。这样代码也将支持 类,如 StringBuilder
和 StringBuffer
。
public static boolean isEmpty(Object value) {
if (value == null)
return true;
if (value instanceof CharSequence) // String, StringBuilder, StringBuffer, ...
return ((CharSequence) value).isEmpty();
if (value instanceof Collection) // List, Set, Queue, Deque, ...
return ((Collection<?>) value).isEmpty();
if (value instanceof Map)
return ((Map<?,?>) value).isEmpty();
if (value.getClass().isArray()) // All array types
return (Array.getLength(value) == 0);
return false;
}
代码已修改为使用纯内置方法,即不依赖 ArrayUtils
。
更新: 添加了对原始数组的支持。
以上实现与 JSP EL empty
运算符非常匹配:
The empty
operator is a prefix operator that can be used to determine if a value is null or empty.
To evaluate empty A
- If
A
is null
, return true
- Otherwise, if
A
is the empty string, then return true
- Otherwise, if
A
is an empty array, then return true
- Otherwise, if
A
is an empty Map
, return true
- Otherwise, if
A
is an empty Collection
, return true
- Otherwise return
false
在 Java 17 中,您可以使用 switch
表达式来编写它。根据 issue 8213076,语法将是:
public static boolean isEmpty(Object value) {
return switch(value) {
case String s -> s.isEmpty();
case List l -> l.isEmpty();
case String[] sa -> ArrayUtils.isEmpty(sa);
default -> value == null;
}
}
注意:这是 Java 17 中的 预览 功能。它可能会在以后的版本中更改甚至完全删除。
(JEP 406 中最初提出的语法有点不同:
public static boolean isEmpty(Object value) {
return switch(value) {
case String -> value.isEmpty();
case List -> value.isEmpty();
case String[] -> ArrayUtils.isEmpty(value);
default -> value == null;
}
}
如您所见,原始版本不需要在每个 case
中使用单独的绑定变量。)
我正在尝试重构时得到了这个方法。
public static boolean isEmpty(Object value) {
boolean empty = false;
if (value instanceof String && ((String) value).isEmpty()) {
empty = true;
} else if (value instanceof List && ((List<?>) value).isEmpty()) {
empty = true;
} else if (value instanceof String[] && ArrayUtils.isEmpty((String[]) value)) {
empty = true;
} else if (value == null) {
empty = true;
}
return empty;
}
是否有我缺少的明显更好的方法?
我知道我可以使用链式 ||
语句将所有条件放在一个 if
语句中,但我真的不明白这比我现在得到的更好。
您可以通过省略标志并直接返回空检查结果来缩短此代码:
public static boolean isEmpty(Object value) {
if (value instanceof String) {
return ((String) value).isEmpty();
} else if (value instanceof List) {
return ((List<?>) value).isEmpty();
} else if (value instanceof String[]) {
return ArrayUtils.isEmpty((String[]) value);
} else {
return value == null;
}
}
这也算是提高了可读性。
Java 本机实用程序使您能够检查 Objects.isNull(value)
是否 not 等同于空。如果您想坚持使用原生 Java,那么您做对了,只需美化您的代码即可。
然而这个方法存在于springFramework ObjectUtils
class 无论对象类型如何:
import org.springframework.util.ObjectUtils;
public static boolean isEmpty(Object value) {
boolean empty = false;
if (ObjectUtils.isEmpty(value)) {
empty= true
}
return empty;
}
Spring 框架文档:Class ObjectUtils
如 if-return
组合改进代码。
然而,您应该更概括您的代码,例如支持所有数组类型,而不仅仅是字符串数组,支持所有集合类型,而不仅仅是列表。
同样,String
实现了一个名为 CharSequence
的接口,因此请支持它。这样代码也将支持 类,如 StringBuilder
和 StringBuffer
。
public static boolean isEmpty(Object value) {
if (value == null)
return true;
if (value instanceof CharSequence) // String, StringBuilder, StringBuffer, ...
return ((CharSequence) value).isEmpty();
if (value instanceof Collection) // List, Set, Queue, Deque, ...
return ((Collection<?>) value).isEmpty();
if (value instanceof Map)
return ((Map<?,?>) value).isEmpty();
if (value.getClass().isArray()) // All array types
return (Array.getLength(value) == 0);
return false;
}
代码已修改为使用纯内置方法,即不依赖 ArrayUtils
。
更新: 添加了对原始数组的支持。
以上实现与 JSP EL empty
运算符非常匹配:
The
empty
operator is a prefix operator that can be used to determine if a value is null or empty.To evaluate
empty A
- If
A
isnull
, returntrue
- Otherwise, if
A
is the empty string, then returntrue
- Otherwise, if
A
is an empty array, then returntrue
- Otherwise, if
A
is an emptyMap
, returntrue
- Otherwise, if
A
is an emptyCollection
, returntrue
- Otherwise return
false
在 Java 17 中,您可以使用 switch
表达式来编写它。根据 issue 8213076,语法将是:
public static boolean isEmpty(Object value) {
return switch(value) {
case String s -> s.isEmpty();
case List l -> l.isEmpty();
case String[] sa -> ArrayUtils.isEmpty(sa);
default -> value == null;
}
}
注意:这是 Java 17 中的 预览 功能。它可能会在以后的版本中更改甚至完全删除。
(JEP 406 中最初提出的语法有点不同:
public static boolean isEmpty(Object value) {
return switch(value) {
case String -> value.isEmpty();
case List -> value.isEmpty();
case String[] -> ArrayUtils.isEmpty(value);
default -> value == null;
}
}
如您所见,原始版本不需要在每个 case
中使用单独的绑定变量。)