在迭代冗余之前调用isEmpty()?

时间:2017-05-08 16:16:47

标签: java

鉴于Collection<Object> foo,我通常会在迭代之前进行此检查:

    if (foo != null && !foo.isEmpty()) {
        for (Object f : foo) {
            // ...
        }
    }

我只是想知道,这被认为是最佳做法吗?不应该isEmpty()检查是多余的,因为for()只会忽略空集合而不会抛出错误?

null检查 - 是否有必要或是否有办法让for()完全忽略null收藏? (没有尝试捕捉for循环)

7 个答案:

答案 0 :(得分:3)

  

isEmpty()检查不应该是多余的,因为for()只会忽略一个空集合而不会抛出错误吗?

这是多余的,在空集合上使用增强的for是完全无害的。请注意,这样做创建一个迭代器对象,因此检查可能会提供一些非常次要的内存流失保护,但通常如果这样做是值得的,那么你会有更大的要解决的问题。

  

null检查怎么样 - 是必要的还是有办法让for()简单地忽略null Collections? (没有尝试捕捉for循环)

除非您要捕获NPE(您说您不想这样做),否则您需要进行null检查,或者您将允许NPE传播给调用者(例如,因为{ {1}}在逻辑上或类似的时候永远不应该是foo

答案 1 :(得分:0)

关于对isEmpty的电话,我可以向您保证这是多余的。您甚至可能想要检查Joshua的Effective Java 2nd并重新访问从每个循环转换而来的代码。

答案 2 :(得分:0)

是的,确实如此。

如果代码的那一点可以为null,则可能只需要foo!= null。

答案 3 :(得分:0)

我最近遇到的最佳做法之一是使用CollectionUtils

if (org.apache.commons.collections.CollectionUtils.isNotEmpty(collectionName)) {
//Iterate through collectionName
}

Apache Commons的CollectionUtils.isNotEmpty(Collection)是一个NULL-SAFE检查

返回TRUE是Collection / List不为空且not-null如果Collection为Null则返回FALSE

以下示例:

List<String> properties = new ArrayList();
if (CollectionUtils.isNotEmpty(properties)) {
  // process the list
} else {
 // list is null or empty
}

需要jar:commons.collections.xxx.jar

答案 4 :(得分:0)

  1. 检查空集合

    不,这不是多余的。你必须这样做以避免NPE。

  2. 检查空集合

    是的,这是多余的。无需这样做。

答案 5 :(得分:0)

我没有看到.isEmpty条件中有任何用处,它只是给代码增加了噪音,使得代码的实际功能难以识别。

  

null检查怎么样 - 是必要的还是有办法让for()简单地忽略null Collections? (没有尝试捕捉for循环)

你应该总是在for-each循环之前检查null。这是您应该考虑的唯一解决方案,因为捕获NPE(和一般的RuntimeExceptions)是bad parctice。运行时异常用于表示在设计时未预料到的情况,这通常意味着编程错误。因此缓存此类异常可以隐藏代码中的真正错误。例如,如果你通过尝试捕获NullPointerException来包围for-each,你怎么知道发生了异常,因为集合是null而不是因为循环中的代码。

答案 6 :(得分:-1)

visibleTiles.isEmpty()

只检查地图是否为空(或)是否有任何元素。

ile = visibleTiles.keySet().iterator().next();

从迭代器中检索下一个元素。

在迭代器上执行hasNext()之前,您需要进行next()检查。

hasNext() javadoc说

  

如果迭代有更多元素,则返回true。 (换一种说法,   如果next会返回一个元素而不是抛出一个元素,则返回true   异常。)所以,如果没有可用的元素,则在迭代器上调用next()   将返回NoSuchElementException。

除此之外,我认为你真的不想空检查

while (!visibleTiles.isEmpty())) {
    ....
}