在Java中验证空集合和空集合的最佳实践


209

我想验证集合是否为空和null。任何人都可以让我知道最佳做法。

目前,我正在检查以下内容:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}

10
除了别的以外,请考虑为什么使用null == sampleMap而不是sampleMap == null。大多数人发现后者更具可读性-前者是其他语言的产物。
乔恩·斯基特

6
顺便说一句,空集合是不好的。如果可能,请将其设为空集合。 See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢声远Shengyuan Lu

@JonSkeet人们在写=而不是==的情况下使用null == sampleMap。如果您使用sampleMap == null,则当您忘记一个=时,它将变为sampleMap = null,这不会引发错误,因此以另一种方式编写它有助于开发人员查看它
Uri Loya

1
@UriLoya:如果您if (null = sampleMap)使用Java 编写,则会出现编译错误。这正是我的第一个评论的重点。它的“原因”是特定于语言的,但是尽管可读性受到了损害,但已经传播到其他语言,因为人们没有考虑为什么要这样做。
乔恩·斯基特

您可以使用org.apache.commons.collections4.CollectionUtils包中提供的CollectionUtils类。有许多实用方法可以找到空或空值。
维卡什

Answers:


312

如果您在项目中使用Apache Commons Collections库,则可以使用CollectionUtils.isEmptyMapUtils.isEmpty()方法分别检查集合或映射是否为或为(即,它们是“空安全的”)。

这些方法背后的代码或多或少是用户@icza在其答案中编写的。

无论您做什么,都请记住,随着代码复杂度的降低,编写的代码越少,测试的代码就越少。


1
感谢MapUtils.isEmpty是检查地图为空还是空的完美解决方案
Narayan Yerrabachu

23
可惜他们没有命名isNullOrEmpty
Scadge '18年

72

那是检查它的最佳方法。您可以编写一个辅助方法来做到这一点:

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

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

也必须具有类似的功能Map<?>
路易吉·门多萨

1
当然,您也可以为地图添加一个,但标题注明了集合。
icza 2012年

1
我不明白如果m为null,那么.isEmpty()会导致NullPointerException僵局?否则,如果左侧(m == null)为true,则将不检查其余部分
Ismail Sahin

4
@ismail ||运算符是短路运算符,表示如果左侧操作数为true,则不会计算右侧操作数。因此,如果m == null,则m.isEmpty()不会被调用(不需要,结果是true)。
icza

完美的解决方案@icza
gaurav,

32

如果您使用Spring框架,则可以CollectionUtils用来检查Collections(列表,数组)和Map等。

if(CollectionUtils.isEmpty(...)) {...}

也许,您为Map谈论MapUtils.isEmpty(),但不是为所有Collection谈论?
帕夫洛·切切霍夫

21

就我个人而言,我更喜欢使用空集合而不是使用空集合,null并且算法的工作方式对于集合是否为空无关紧要。


10

当您使用弹簧时,您可以使用

boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

其中obj是任何[map,collection,array,aything ...]

否则:代码为:

public static boolean isEmpty(Object[] array) {
    return (array == null || array.length == 0);
}

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

对于String最好的是:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

3

如果需要检查是否为空,那就是这种方式。但是,如果您对此有控制权,则只要可以就可以返回空集合,以后只检查是否为空。

这个线程与C#差不多,但是这些原理同样适用于Java。如此处所述,只有在以下情况下才应返回null

  • null可能意味着更具体;
  • 您的API(合同)可能会迫使您返回null。


1

我们将检查Collection对象为空,是否为null。下面给出的所有这些方法都存在于org.apache.commons.collections4.CollectionUtils包中。

检查列表或设置收集对象的类型。

CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);

检查对象的地图类型。

MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);

所有方法的返回类型均为布尔值。


-1

对于包括地图在内的所有集合,请使用以下isEmpty方法:这些集合对象上的方法。但是您必须在执行空检查之前:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.