如何检查列表中的下一个元素是否为空?
while(it.hasNext()){
System.out.println(it.next()+"\n");
}
这是我尝试的方式,但是当最后一个元素为null时,它将其打印为null。
我试图改变它
while(it.hasNext()){
if(it.next()==null){
}else
System.out.println(it.next()+"\n");
}
但这只会让它变得更糟,因为有些元素甚至不打印!
这是我的迭代方法/匿名类
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(){}
};
}
空打印仅发生在最后一个元素上 谢谢。
答案 0 :(得分:10)
当然,像
这样的代码if (it.next() == null){
} else {
System.out.println(it.next()+"\n");
}
正如您所观察到的,将消耗所有其他非null
元素。另外,在不检查it.next()
的情况下调用it.hasNext()
会导致灾难。
为什么不写
Foo/*ToDo - use the correct type here*/ foo = it.next()
if (foo != null){
/*ToDo*/
}
代替?
答案 1 :(得分:5)
不能以这种方式工作,因为如果it.next()
不是null
,则会拨打it.next()
两次,这会让您跳过一个甚至无法使用的值。
使用变量作为下一个:
Object o = it.next();
if (o != null) {
...
}
答案 2 :(得分:5)
你应该使用stream而不是iterator。
filmList.stream().filter(film->film!=null).filter(film->film.is3D())
编辑: 或者,如果你不在Java 8中:
Predicate<Film> isNotNullAnd3D = new Predicate<Person>() {
public boolean apply(Film f) {
return f != null && f.is3D();
}
};
Collection2.filter(filmList, isNotNullAnd3D)
答案 3 :(得分:1)
你从未提到为什么首先明确地使用迭代器。 为什么不使用这样的隐式迭代器表示法? :
for (Film film : filmList) {
if (film != null ){
....
}
}
答案 4 :(得分:0)
除了其他人所说的之外:如果您正在使用原始类型(例如 int
for (int node : input) {
doSomething(node);
}
您可能需要考虑使用 Wrapper 类:
for (Integer node : input) {
if (node == null) throw new IllegalArgumentException();
doSomething(node);
}