检查java对象是否为集合、数组或字符串且为空

kcugc4gi  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(421)

在我尝试重构的那一刻,我得到了这个方法。

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 使用链表的语句 || 声明,但我真的不认为这比我现在得到的更好。

fcg9iug3

fcg9iug31#

正如dehaar在回答中提到的,代码可以通过使用 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

nkcskrwz

nkcskrwz2#

在Java17中,您将能够使用 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中的一个预览功能。在以后的版本中,它可能会更改甚至完全删除。
(JEP406中最初提出的语法有点不同:

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 .)

vmjh9lq9

vmjh9lq93#

您可以通过省略标志并直接返回空性检查的结果来缩短此代码:

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;
    }
}

这可视为可读性的改进。

1wnzp6jl

1wnzp6jl4#

java原生UTIL使您能够检查 Objects.isNull(value) 这不等于空。如果你想坚持使用本机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框架文档:类objectutils

相关问题