有没有一种方法可以避免在for-each循环迭代开始之前进行空检查?

| 每次我必须遍历一个集合时,我都会在for-each循环开始迭代之前检查是否为null。像这样:
if( list1 != null ){
    for(Object obj : list1){

    }
}
有没有一种较短的方法,这样我们就可以避免编写\“ if \”块? 注意:我正在使用Java 5,并且将在一段时间内使用它。     
已邀请:
如果可能的话,您应该设计代码,使集合首位不是“ 1”。
null
收集是不好的做法(由于这个原因);您应该改用空集合。 (例如,
Collections.emptyList()
) 另外,您可以创建一个包装类,该包装类实现
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”块比使用这些技术要好。是的..在任何人再次提到它之前:) \“ ideally \”该代码应设计为使得列表永远不应为null     
已经是2017年了,您现在可以使用Apache Commons Collections4 用法:
for(Object obj : CollectionUtils.emptyIfNull(list1)){
    // Do your stuff
}
    
在Java 8中,可以使用
java.util.Optional
ifPresent
方法提供另一种解决方案。
Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
因此,这不是解决确切问题的方法,而是一种统一的方法,并且可能更为优雅。     
空检查在增强的for循环中
public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}
然后使用:
for (Object object : emptyIfNull(someList)) { ... }
    
Apache Commons
for (String code: ListUtils.emptyIfNull(codes)) {

}           
谷歌番石榴
for (String code: Optional.of(codes).get()) {

}
    
您希望它短多少?它仅是额外的2行,并且逻辑清晰简洁。 我认为您需要决定的更重要的事情是
null
是否为有效值。如果它们无效,则应编写代码以防止发生这种情况。然后,您将不需要这种检查。如果执行
foreach
循环时遇到异常,则表明您的代码其他地方存在错误。     
1)如果list1是类的成员,则在构造函数中创建列表,使其在该列表中,并且尽管为空也不为null。 2)对于(Object obj:list1!= null?list1:new ArrayList())     
另一种Java 8+方法是创建一个forEach方法,该方法在使用
null
值时不会崩溃:
public static <T> void forEach(Iterable<T> set, Consumer<T> action) {
    if (set != null) {
        set.forEach(action);
    }
}
自己定义的ѭ18的用法与本机Java 8相似:
ArrayList<T> list = null;

//java 8+ (will throw a NullPointerException)
list.forEach(item -> doSomething(...) );

//own implementation
forEach(list, item -> doSomething(...) );
    

要回复问题请先登录注册