在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,那么就不运行循环?


当前回答

你可以写一个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”很重要——如果它真的不应该为空,你肯定应该抛出一个异常。你知道有些地方出了问题,但你不知道损害的程度。提前中止。

其他回答

另一种有效防止for循环中出现null值的方法是使用谷歌Guava的Optional<T>包装集合,因为这样可以明确有效空集合的可能性,因为客户端将期望使用Optional. ispresent()检查集合是否存在。

Java 8可选:

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}

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

的用法:

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

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

使用ArrayUtils。数组的common -lang库中的nullToEmpty

for( Object o : ArrayUtils.nullToEmpty(list) ) {
   // do whatever 
}

这个功能存在于common -lang库中,大多数Java项目都包含这个库。

// ArrayUtils.nullToEmpty source code 
public static Object[] nullToEmpty(final Object[] array) {
    if (isEmpty(array)) {
        return EMPTY_OBJECT_ARRAY;
    }
    return array;
}

// ArrayUtils.isEmpty source code
public static boolean isEmpty(final Object[] array) {
    return array == null || array.length == 0;
}

这和@OscarRyz给出的答案是一样的,但为了DRY的咒语,我认为它值得注意。参见commons-lang项目页面。下面是nullToEmpty API文档和源代码

在项目中包含common -lang(如果还没有)的Maven条目。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

不幸的是,common -lang没有为List类型提供此功能。在这种情况下,您必须使用前面提到的helper方法。

public static <E> List<E> nullToEmpty(List<E> list)
{
    if(list == null || list.isEmpty())
    {
        return Collections.emptyList();
    }
    return list;
}

我已经修改了上面的答案,所以你不需要从对象强制转换

public static <T> List<T> safeClient( List<T> other ) {
            return other == null ? Collections.EMPTY_LIST : other;
}

然后简单地调用列表

for (MyOwnObject ownObject : safeClient(someList)) {
    // do whatever
}

解释: MyOwnObject:如果List<Integer>,那么MyOwnObject在这种情况下将是Integer。