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

2022-08-31 08:15:50

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

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

    }
}

有没有更短的方法,这样我们就可以避免编写“if”块?注意:我正在使用Java 5,并且会坚持一段时间。


答案 1

如果可能,应将代码设计为集合不在一开始就放在首位。null

null收集是不好的做法(出于这个原因);您应该改用空集合。(例如,Collections.emptyList())

或者,您可以创建一个包装类,该类实现并获取集合,并处理集合。
然后你可以写Iterablenullforeach(T obj : new Nullable<T>(list1))


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

或者,如果保存文本行是优先级(不应该是)

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

会允许你写

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

当然,这实际上只是将复杂性转移到了其他地方。