检查 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 的接口,因此请支持它。这样代码也将支持 类,如 StringBuilderStringBuffer

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 中使用单独的绑定变量。)