检查Java对象是否为Collection、Array或String且为空
在我尝试重构的那一刻,我已经有了这个方法。
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表达式来编写它。根据问题 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. 中不需要单独的绑定变量。)
- 语法可能类似于 JDK 16 的 `instanceof` 模式匹配。所以你需要每个 case 一个新的标识符: `return switch(value) { case String s -> s.isEmpty(); 案例列表 l -> l.isEmpty(); case String[] a -> ArrayUtils.isEmpty(a); 默认 -> 值 == 空;};`
- `instanceof` 模式匹配也可以工作,即 `return value instanceof String s? s.isEmpty(): value instanceof List l? l.isEmpty(): value instanceof String[] a? ArrayUtils.isEmpty(a): value == null;` 已经可以在 JDK 16 中使用了。使用 `--enable-preview` 时,它甚至可以在 JDK 14 和 15 中使用。
- @Holger 放大 Holger 的评论:每种情况都需要一个新的绑定变量,在他的示例中显示为`case String s -> s.isEmpty();`。`value` 的类型不会像 Kotlin 的流类型那样在不同的地方移动。另请注意,开关模式是 Java 17 中的 _preview_ 功能,因此它们不适用于生产用途,并且将来可能会发生变化。
THE END
二维码