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

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)

代替?


sab*_*sab 6

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

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)

  • 不确定这是否是一件坏事;应该认为Java 8解决方案在Java标签上是可以接受的。有一个赞! (2认同)

Nic*_*tto 5

不,它不能以这种方式工作,因为如果it.next()不是nullit.next()两次调用,这将使你跳过一个甚至无法获得的值.

使用变量代替下一个:

Object o = it.next();
if (o != null) {
   ...
}
Run Code Online (Sandbox Code Playgroud)