在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.Optional
和ifPresent
方法可以获得另一个解决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 }