检查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 -&gt; s.isEmpty(); 案例列表 l -&gt; l.isEmpty(); case String[] a -&gt; ArrayUtils.isEmpty(a); 默认 -&gt; 值 == 空;};`
  • `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 -&gt; s.isEmpty();`。`value` 的类型不会像 Kotlin 的流类型那样在不同的地方移动。另请注意,开关模式是 Java 17 中的 _preview_ 功能,因此它们不适用于生产用途,并且将来可能会发生变化。

以上是检查Java对象是否为Collection、Array或String且为空的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>