检查 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 表达式编写此代码。根据 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 的接口,因此支持它。这样,代码也将支持 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 运算符非常匹配:

empty 运算符是一个前缀运算符,可用于确定值是 null 还是空。

评估empty A

  • 如果 Anull,则返回 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