问题描述
我在尝试重构的时候已经有了这个方法。
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
语句将所有条件放在一个 ||
语句上,但我真的看不出这比我现在得到的更好。
解决方法
在 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) {
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;
}
}
这可以被认为是提高了可读性。
,如 deHaar's answer 中所述,可以通过使用 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
运算符非常匹配:
empty
运算符是一个前缀运算符,可用于确定值是 null 还是空。
评估empty A
- 如果
A
为null
,则返回true
- 否则,如果
A
为空字符串,则返回true
- 否则,如果
A
为空数组,则返回true
- 否则,如果
A
是空的Map
,则返回true
- 否则,如果
A
是空的Collection
,则返回true
- 否则返回
false
Java 本机实用程序使您能够检查 Objects.isNull(value)
是否not 等价于空。如果您想坚持使用本机 Java,那么您就做得对,只需美化您的代码即可。
但是,无论对象类型如何,此方法都存在于 springFramework ObjectUtils
类中:
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