空检查增强for循环

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

这看起来很丑陋:

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

要么

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

可能没有其他办法。 他们是否应该把它放在构造本身,如果它是空的,那么不要运行循环?

你应该更好地validation你从哪里得到的名单。

一个空列表是你所需要的,因为一个空列表不会失败。

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

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

当然, safe将是:

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

如果你传入null,你可能会编写一个返回空序列的帮助器方法:

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

然后使用:

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

我不认为我真的这样做 – 我通常会使用你的第二种forms。 特别是,“或抛出”是重要的 – 如果它不应该是空的,你一定要抛出exception。 你知道有什么地方出了问题,但是你不知道损坏的程度。 提前中止。

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

用法:

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

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

如果您从您实现的方法调用中获取该List ,则不要返回null ,并返回一个空List

如果你不能改变实现,那么你坚持使用null检查。 如果不应该为null ,则抛出exception。

我不会去帮助方法返回一个空的列表,因为它可能会有用的一些时间,但是你会习惯在你做的每个循环中调用它可能隐藏一些错误。

我已经修改了上面的答案,所以你不需要从Object投射

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

然后简单地调用List

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

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

TL; DR使用来自commons-lang数组库的ArrayUtils.nullToEmpty

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

该function存在于大多数Java项目中的commons-lang库中。

 // 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 文档和源代码

如果Maven项目尚未包含commons-lang ,请将其添加到项目中。

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

不幸的是, commons-lang不提供Listtypes的这个function。 在这种情况下,您将不得不使用前面提到的帮助方法。

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

使用Java 8 Optional

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

另一种有效地防止for循环中的空值的方法是用Google Guava的Optional<T>包装你的集合,因为希望客户端可以检查集合与Optional.isPresent()

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

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

ObjectUtils.defaultIfNull JavaDoc

使用CollectionUtils.isEmpty(Collection coll)方法,如果指定的collection是空的,则为Null-safe检查。

为此import org.apache.commons.collections.CollectionUtils

Maven依赖

 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency> 
 for (Object object : someList) { // do whatever } throws the null pointer exception.