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

rk2*_*010 106 java foreach for-loop

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

是否有更短的方法,以便我们可以避免编写"if"块?注意:我使用的是Java 5,并且会在一段时间内坚持使用它.

SLa*_*aks 82

如果可能,您应该设计代码,使收集不在null第一位.

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

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

  • 我只是其中一个开发者......在那个排名很低的那个:) (2认同)
  • 如果使用泛型,最好使用Collections.emptyList()而不是Collections.EMPTY_LIST;类型安全。 (2认同)

Edw*_*uck 43

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

会允许你写

for (Object obj : nullGuard(list)) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案,但可能应该是一个静态的. (13认同)

rk2*_*010 32

我想正确的答案是:没有办法让它更短.有一些技术,如评论中的那些,但我不认为自己使用它们.我认为写一个"if"块比使用这些技术更好.并且是..在任何人再次提到它之前:)"理想地"代码应该被设计为使得列表永远不应该是null


Fre*_*Pym 21

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

用法:

for(Object obj : CollectionUtils.emptyIfNull(list1)){
    // Do your stuff
}
Run Code Online (Sandbox Code Playgroud)

  • `for(Object obj : ArrayUtils.nullToEmpty(list1)) { // 做你的事情 }` (2认同)

was*_*ren 19

在Java 8中,通过使用java.util.OptionalifPresent-method 可以获得另一种解决方案.

Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
Run Code Online (Sandbox Code Playgroud)

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

  • Java 8“可选”是一种治疗方法比疾病更糟糕的情况。“Optional”是一个冗长且笨拙的简单空检查的替代品。在我看来,要避免。 (4认同)

gav*_*koa 12

Null检查增强的for循环

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

然后使用:

for (Object object : emptyIfNull(someList)) { ... }
Run Code Online (Sandbox Code Playgroud)


Ker*_*ğan 10

Apache Commons

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

}           
Run Code Online (Sandbox Code Playgroud)

谷歌番石榴

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

}
Run Code Online (Sandbox Code Playgroud)


unh*_*ler 7

你想要它多短多少?它只是一个额外的2行,它是清晰简洁的逻辑.

我认为你需要决定的更重要的是if是否null是有效值.如果它们无效,您应该编写代码以防止它发生.那你就不需要这种检查了.如果你在做foreach循环时遇到异常,那就表明代码中的其他地方存在错误.


Chr*_*ris 5

1)如果list1是一个类的成员,则在构造函数中创建列表,使其在那里并且非空但是为空.

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

  • 使用 Collections.emptyList() 会好得多。为什么分配一些东西只是为了垃圾收集? (2认同)