【问题标题】:Is CollectionUtils.isNotEmpty() better than a null check?CollectionUtils.isNotEmpty() 是否比空检查更好?
【发布时间】:2015-06-05 12:24:39
【问题描述】:

许多建议在以下用例中也使用CollectionUtils.isNotEmpty(coll) 而不是coll != null

if (CollectionUtils.isNotEmpty(coll)) {
    for (String str : coll) {
    }
}

而不是

if (coll != null) {
    for (String str : coll) {
    }
}

这里有什么理由/优势使用CollectionUtils.isNotEmpty(coll) 而不是其他的吗?谢谢。

【问题讨论】:

  • 在这种特定情况下,没有。但有时您会在循环之前执行其他操作,例如准备结构。
  • 空检查相关问题:stackoverflow.com/questions/271526
  • @DenysSéguret,在这种特定情况下,它确实有所作为。如果collnullfor (String str : coll) 将抛出NullPointerException
  • @aioobe 有一个测试。问题是关于这两个测试之间的区别
  • @aioobe 这与“检查 Java 中的集合是否为空:这是最好的方法”不是重复的

标签: java collections java-7 java-collections-api


【解决方案1】:

如上所述,这取决于您要测试什么以及您的逻辑是如何构建的。

假设你的例子

if (CollectionUtils.isNotEmpty(coll)) {
  for (String str : coll) {
     System.out.println("Branch 1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch 2. Collection is empty.");
}

在这个例子中,我们可以看到,总是 Branch1 或 Branch2 被执行。

如果我们使用空表达式,如果coll不是空而是空,结果会有所不同

if (coll != null) {
  for (String str : coll) {
     System.out.println("Branch1. Collection is not empty.");
  }
}
else {
  System.out.println("Branch2. Collection is empty.");
}

如果集合coll不为null但为空,Branch1或Branch2都不会执行,因为条件coll != null为真,但在循环for中甚至没有通过。

当然,if 表达式 coll != null && coll.isNotEmpty()CollectionUtils.isNotEmpty(coll) 做同样的工作。

因此,仅在集合coll != null 的情况下使用 null 测试是不可取的编程方式。这是一个处理不当的极端条件的情况,这可能是不良结果的根源。

【讨论】:

    【解决方案2】:

    反编译揭示

    public static boolean isEmpty(Collection coll) {
        return coll == null || coll.isEmpty();
    }
    

    【讨论】:

      【解决方案3】:

      这里没有真正的优势。即使有,也将非常小。它只是防止创建Iterator 并执行分支指令,仅此而已。

      这个小优势只有在集合为空时才会出现。以下循环:

      for (String str : coll) {
         ...
      }
      

      相当于:

      for (Iterator<String> iterator = col.iterator(); iterator.hasNext();) {
         String str = iterator.next();
         ...
      }
      

      当集合为空时,对CollectionUtils.isNotEmpty(coll) 的检查会阻止循环执行。因此没有在内存中创建Iterator,也没有调用hasNext()。这是以O(1) 调用coll.isEmpty() 为代价的。

      【讨论】:

        【解决方案4】:

        问题是,当集合不为空时,集合仍然可以是空的。因此,就您而言,这取决于您的偏好。

        【讨论】:

        • 这里没有任何改变。
        猜你喜欢
        • 2016-07-03
        • 1970-01-01
        • 2018-01-15
        • 2019-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多