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))
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)
当然,这实际上只是将复杂性转移到其他地方.
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)
was*_*ren 19
在Java 8中,通过使用java.util.Optional
和ifPresent
-method 可以获得另一种解决方案.
Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
Run Code Online (Sandbox Code Playgroud)
所以,不是解决确切问题的解决方案,但它是一个oneliner,可能更优雅.
gav*_*koa 12
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)
你想要它多短多少?它只是一个额外的2行,它是清晰简洁的逻辑.
我认为你需要决定的更重要的是if是否null
是有效值.如果它们无效,您应该编写代码以防止它发生.那你就不需要这种检查了.如果你在做foreach
循环时遇到异常,那就表明代码中的其他地方存在错误.
1)如果list1是一个类的成员,则在构造函数中创建列表,使其在那里并且非空但是为空.
2)for(Object obj:list1!= null?list1:new ArrayList())
归档时间: |
|
查看次数: |
106236 次 |
最近记录: |