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

时间:2016-06-17 09:32:54

标签: java null iterator anonymous-class

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

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

空打印仅发生在最后一个元素上 谢谢。

5 个答案:

答案 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-each 循环
for (int node : input) {
    doSomething(node);
}

您可能需要考虑使用 Wrapper 类:

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