当前位置: 首页 > 知识库问答 >
问题:

如何编写一个泛型的isEmpty方法,它可以检查null和Empty?

穆睿才
2023-03-14

我在写一个实用方法,它可以检查空的和空的字符串,或者集合,或者一个对象,或者任何一般的类型-

public static boolean isEmpty(Object obj) {
    if (obj == null)
        return true;
    if (obj instanceof Collection)
        return ((Collection<?>) obj).size() == 0;

    // is below line expensive?
    final String s = String.valueOf(obj).trim();

    return s.length() == 0 || s.equalsIgnoreCase("null");
}

由于上面的isempty方法将从性能非常关键的应用程序中多次调用,如何使我的上面的方法高效?

final String s = String.valueOf(obj).trim();
public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }
    return false;
}

public static boolean isEmpty(Collection<?> value) {
    if (value == null || value.isEmpty()) {
        return true;
    }
    return false;
}

public static boolean isEmpty(String value) {
    if (value == null || value.isEmpty()) {
        return true;
    }
    return false;
}
public static void main(String[] args) {

    Map<String, String> hello = new HashMap<String, String>();
    System.out.println(isEmpty(hello));

    Map<String, HashMap<Integer, String>> primary = new HashMap<String, HashMap<Integer, String>>();
    System.out.println(isEmpty(primary));

}

public static boolean isEmpty(Collection<?> value) {
    return value == null || value.isEmpty();
}

public static boolean isEmpty(Map<?, ?> value) {
    return value == null || value.isEmpty();
}

共有1个答案

程亦
2023-03-14

这在我看来是个糟糕的设计。Null是Null,empty是空,如果是字符串,则是字符串,依此类推。不要试图用一种方法把所有事情都搞乱。这对可维护性和可读性不利。

if (str == null || str.isEmpty())
    ...

而且

if (coll == null || coll.isEmpty())

都很好。

if (value == null || value.isEmpty()) {
    return true;
}
return false;

只要做

return value == null || value.isEmpty();
 类似资料:
  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • 我有一小段代码。我想用更好的方式写它,用更少的嵌套支票。我怎样才能实现呢? 有没有什么简洁的方法可以让我用Java 8重写上面的代码呢?

  • 我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。 基本泛型类: 儿童班: 实施: 我想在其中覆盖参数化方法的子视图类: 这是Eclipse抛出错误消息的地方: 注意类和接口:事件和级别: 以及继承自 的 Model 类 我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdap

  • 来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。 方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。 是对一个 如果是这样,什么是错的? EDIT1:或者如果我切换通用类型: 这种情况下有什么问题? EDIT2:我知道如何修复它,但我想了解,在这

  • 这是如何编译的: 但这并不是: 它给我以下编译错误: Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数) 错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个 擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?

  • 我有一些可为空的值,希望在访问它们的值时避免异常。下面展示了我想要实现的一个示例。我目前有 但我看到可为空的值有一个属性。等价物将是 有什么方法可以把代码简化成这样吗? 以便它只在不为空时运行?