在Java中防止for循环为空的最好方法是什么?

这看起来很丑陋:

if (someList != null) {
    for (Object object : someList) {
        // do whatever
    }
}

Or

if (someList == null) {
    return; // Or throw ex
}
for (Object object : someList) {
    // do whatever
}

可能没有别的办法了。他们是否应该把它放在for构造本身中,如果它是null,那么就不运行循环?


当前回答

现在已经是2017年了,您现在可以使用Apache Commons Collections4了

的用法:

for(Object obj : ListUtils.emptyIfNull(list1)){
    // Do your stuff
}

您可以使用CollectionUtils.emptyIfNull对其他Collection类进行相同的空安全检查。

其他回答

你最好核实一下你的名单是从哪里来的。

您只需要一个空列表,因为空列表不会失败。

如果你从其他地方得到这个列表,不知道它是否正确,你可以创建一个实用程序方法,像这样使用它:

for( Object o : safe( list ) ) {
   // do whatever 
 }

当然,安全的是:

public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}

使用,CollectionUtils。方法isEmpty(集合coll),该方法是空安全检查指定的集合是否为空。

对于此导入org.apache.commons.collections.CollectionUtils。

Maven的依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

如果你从你实现的方法调用中获得List,那么不要返回null,而是返回一个空的List。

如果你不能改变实现,那么你就会被空检查所困。如果它不应该为空,则抛出异常。

我不会选择返回空列表的helper方法,因为它有时可能有用,但这样你就会习惯在每次循环中调用它,可能会隐藏一些错误。

对于那些对编写自己的静态空安全方法不感兴趣的人,你可以使用:commons-lang的org.apache.commons.lang.ObjectUtils.defaultIfNull(对象,对象)。例如:

    for (final String item : 
    (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

ObjectUtils.defaultIfNull JavaDoc

你可以写一个helper方法,如果你传入null,它会返回一个空序列:

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

然后使用:

for (Object object : emptyIfNull(someList)) {
}

我想我不会这么做,我通常会用第二种形式。特别地,“or throw ex”很重要——如果它真的不应该为空,你肯定应该抛出一个异常。你知道有些地方出了问题,但你不知道损害的程度。提前中止。