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

Posted

技术标签:

【中文标题】在 Java 中验证 null 和空集合的最佳实践【英文标题】:Best practice to validate null and empty collection in Java 【发布时间】:2012-09-25 02:58:15 【问题描述】:

我想验证一个集合是否为空和null。谁能告诉我最佳做法。

目前,我正在检查如下:

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

【问题讨论】:

除此之外,想想为什么你使用null == sampleMap而不是sampleMap == null。大多数人发现后者更具可读性——前者是其他语言的遗留物。 顺便说一句,空集合是不好的。如果可能,请将其设为空集合。 See Effective Java: Item 43 - Return empty arrays or collections, not nulls. @JonSkeet 人们使用 null == sampleMap 以防他们写 = 而不是 ==。如果你使用 sampleMap == null,当你忘记一个 = 时,它会变成 sampleMap = null,这不会引发错误,因此以另一种方式编写它有助于开发人员看到它 @UriLoya:如果你用 Java 写 if (null = sampleMap),你会得到一个编译错误。这正是我第一条评论的重点。它的“原因”是特定于语言的,但尽管存在可读性损失,但已经传播到其他语言,因为人们没有考虑为什么他们这样做。 您可以使用 org.apache.commons.collections4.CollectionUtils 包中的 CollectionUtils 类。有很多实用方法可以查找空或 null。 【参考方案1】:

如果您在项目中使用Apache Commons Collections 库,您可以使用CollectionUtils.isEmptyMapUtils.isEmpty() 方法分别检查集合或地图是否为emptynull (即它们是“null-safe”)。

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

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

【讨论】:

【参考方案2】:

这是最好的检查方法。你可以编写一个辅助方法来做到这一点:

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&lt;?&gt; 也应该有类似的功能。 当然,您也可以为地图添加一个,但标题说明了收藏。 我不明白如果 m 为 null 那么 .isEmpty() 会导致 NullPointerException 吗?否则,如果左边 (m==null) 为真,则剩余部分不会被检查 @ismail || 运算符是一个短路运算符,这意味着如果左操作数是true,它不会计算右操作数。所以如果m == null,那么m.isEmpty()就不会被调用(不需要,结果是true)。【参考方案3】:

如果您使用 Spring 框架,那么您可以使用 CollectionUtils 来检查集合(列表、数组)和映射等。

if(CollectionUtils.isEmpty(...)) ...

【讨论】:

也许,您说的是 MapUtils.isEmpty() 用于 Map,但不是用于所有 Collection?【参考方案4】:

就我个人而言,我更喜欢使用空集合而不是 null,并且让算法以某种方式工作,对于算法而言,集合是否为空并不重要。

【讨论】:

【参考方案5】:

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

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;

对于字符串最好的是:

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

【讨论】:

【参考方案6】:

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

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

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

检查对象的地图类型。

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

所有方法的返回类型都是布尔值。

【讨论】:

CollectionUtils.isEmpty(listObject);这不适用于所有收藏。我已经尝试过设置,但它不起作用。 检查集合对象是否为空、是否为空的核心部分是collection == null || collection.isEmpty() 在内部所以你可以使用它。【参考方案7】:

可以使用org.apache.commons.lang.Validate的“notEmpty”方法:

Validate.notEmpty(myCollection) -> 验证指定的参数集合既不是 null 也不是零大小(无元素);否则抛出异常。

【讨论】:

【参考方案8】:

如果您需要检查 null,那就是这样。但是,如果您对此有控制权,请尽可能返回空集合,然后仅检查是否为空。

This thread 与 C# 大致相同,但原理同样适用于 java。就像那里提到的那样,只有在

null 可能意味着更具体的东西; 您的 API(合同)可能会强制您返回 null。

【讨论】:

【参考方案9】:

对于包括地图在内的所有集合使用:isEmpty 方法,这些集合对象上存在。但是你必须先做一个空检查:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......

【讨论】:

以上是关于在 Java 中验证 null 和空集合的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

说出几点 Java 中使用 Collections 的最佳实践?

Backbone.js 模型和集合的最佳实践

Java null最佳实践

Firestore 用户管理最佳实践?

Java 集合类框架的最佳实践有哪些?

构造函数重载 - Java 中的最佳实践 [关闭]