在for-each循环迭代开始之前,有没有办法避免空检查?

每次我必须迭代一个集合,最终在for-each循环迭代开始之前检查null。 喜欢这个:

if( list1 != null ){ for(Object obj : list1){ } } 

有没有更简单的方法,以便我们可以避免写“if”块? 注意:我正在使用Java 5,并且会在一段时间内停留。

如果可能的话,你应该devise你的代码,使集合不为null

null收集是不好的做法(为此); 你应该使用空集合。 (例如Collections.emptyList()

或者,您可以创build一个实现Iterable的包装类,并接受一个集合,并处理一个null
然后你可以写foreach(T obj : new Nullable<T>(list1))

 public <T extends Iterable> T nullGuard(T item) { if (item == null) { return Collections.EmptyList; } else { return item; } } 

会让你写

 for (Object obj : nullGuard(list)) { ... } 

当然,这真的只是在其他地方复杂化。

我想正确的答案是:没有办法缩短。 有一些技术,如评论中的,但我没有看到自己使用它们。 我认为写一个“if”块比使用这些技术更好。 和是的..在任何人再次提到它之前:)“理想情况下”的代码应该是desgined,这样的列表不应该是null

空检查增强for循环

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

然后使用:

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

你想要多短多less? 这只是一个额外的2线,它是清晰和简洁的逻辑。

我认为你需要决定更重要的是如果null是一个有效值或不。 如果他们无效,你应该写你的代码,以防止发生。 那么你不需要这种检查。 如果您在执行foreach循环时遇到exception,则表示代码中有其他位置存在错误。

1)如果list1是一个类的成员,在构造函数中创build列表,所以它在那里,非空,尽pipe是空的。

2)for(Object obj:list1!= null?list1:new ArrayList())

在Java 8中,通过使用java.util.OptionalifPresent方法可以获得另一个解决scheme。

 Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */})); 

所以,不是一个确切的问题的解决scheme,但它是一个oneliner,可能更优雅。

Apache Commons

 for (String code: ListUtils.emptyIfNull(codes)) { } 

Google Guava

 for (String code: Optional.of(codes).get()) { } 

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

用法:

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