如何检查 Iterator.next() 是否为 == null?

How to check if Iterator.next() is == null?

如何检查列表中的下一个元素是否为空?

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");
            }

但这只会让情况变得更糟,因为有些元素甚至不打印!

这是我的迭代method/anonymousclass

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(){}
        };
    }

null 打印只发生在最后一个元素 谢谢。

自然地,代码像

if (it.next() == null){
} else {
    System.out.println(it.next()+"\n");
}

将消耗所有其他非 null 元素,如您所见。加上不检查 it.hasNext() 就调用 it.next() 是灾难的根源。

为什么不写

Foo/*ToDo - use the correct type here*/ foo = it.next()
if (foo != null){
    /*ToDo*/
}

而不是?

不,它不能以这种方式工作,因为如果 it.next() 不是 null,您调用 it.next() 两次,这将使您跳过一个甚至不可用的值。

使用变量代替下一个:

Object o = it.next();
if (o != null) {
   ...
}

你应该使用流而不是迭代器。

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)

你从来没有提到为什么你一开始就明确地使用迭代器。 为什么不使用这样的隐式迭代器表示法呢? :

for (Film film : filmList) {
  if (film != null ){
     ....
  }
}

除其他人所说的之外:如果您正在使用 原始类型 进行 for-each 循环,例如 int

for (int node : input) {
    doSomething(node);
}

您可能要考虑使用 Wrapper class 代替:

for (Integer node : input) {
    if (node == null) throw new IllegalArgumentException();
    doSomething(node);
}