Laz*_*low 5 java null iterator anonymous-class
如何检查列表中的下一个元素是否为空?
while(it.hasNext()){
System.out.println(it.next()+"\n");
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试的方式,但是当最后一个元素为null时,它将其打印为null.
我试着改变它
while(it.hasNext()){
if(it.next()==null){
}else
System.out.println(it.next()+"\n");
}
Run Code Online (Sandbox Code Playgroud)
但这只是让它变得更糟,因为有些元素甚至不打印!
这是我的迭代方法/匿名类
public Iterator<Filmi> iterator3DFilms ()throws FilmiException{
if(filmList.isEmpty())
throw new FilmiException("No Films on the list");
return new Iterator<Filmi>(){
private int index=0;
public boolean hasNext(){
return index <filmList.size();
}
public Filmi next(){
Filmi lb = filmList.get(index++);
if(lb.is3D()== true)
return lb;
if(hasNext())
return next();
return null;
}
public void remove(){}
};
}
Run Code Online (Sandbox Code Playgroud)
空打印只发生在最后一个元素谢谢.
Bat*_*eba 11
当然,代码就像
if (it.next() == null){
} else {
System.out.println(it.next()+"\n");
}
Run Code Online (Sandbox Code Playgroud)
将会消耗所有其他非null元素,正如您所观察到的那样.加上it.next()不经检查的电话it.hasNext()就是灾难.
为什么不写
Foo/*ToDo - use the correct type here*/ foo = it.next()
if (foo != null){
/*ToDo*/
}
Run Code Online (Sandbox Code Playgroud)
代替?
你应该使用流而不是迭代器.
filmList.stream().filter(film->film!=null).filter(film->film.is3D())
Run Code Online (Sandbox Code Playgroud)
编辑:或者,如果你不是在Java 8中:
Predicate<Film> isNotNullAnd3D = new Predicate<Person>() {
public boolean apply(Film f) {
return f != null && f.is3D();
}
};
Collection2.filter(filmList, isNotNullAnd3D)
Run Code Online (Sandbox Code Playgroud)
不,它不能以这种方式工作,因为如果it.next()不是null你it.next()两次调用,这将使你跳过一个甚至无法获得的值.
使用变量代替下一个:
Object o = it.next();
if (o != null) {
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12113 次 |
| 最近记录: |