【问题标题】:Best practice to validate null and empty collection in Java在 Java 中验证 null 和空集合的最佳实践
【发布时间】: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。

标签: java collections


【解决方案1】:

如果您在项目中使用Apache Commons Collections 库,您可以使用CollectionUtils.isEmpty 和MapUtils.isEmpty() 方法分别检查集合或地图是否为empty 或null (即它们是“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())
            ......
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-11-01
              • 2011-09-22
              • 2011-08-24
              • 2015-10-20
              • 1970-01-01
              • 2010-09-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多