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

5

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

while(it.hasNext()){

            System.out.println(it.next()+"\n");
        }

这是我的尝试,但当最后一个元素为空时,它会将其打印为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(){}
        };
    }

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


为什么首先会有空值?我认为主要问题在于填充迭代器的代码。你不能控制吗? - SCouto
迭代器是否会给你列表中的第一部电影? - Keiwan
在Filmi的next()方法中,它会测试电影是否为3D,并在hasNext()方法中,如果没有任何一个,则返回null。这就是null的来源,但我必须返回一些东西。 - Lazlow
@keiwan 是的,它可以。 - Lazlow
每次调用 it.next() 时,您都会获得下一个值。如果您想多次使用此值,则必须使用变量并查看该变量。 - Peter Lawrey
5个回答

11

自然地,像这样的代码

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*/
}

相反呢?


8

不行,不能这样操作,因为如果 it.next() 不是 null,你会调用两次 it.next(),这将使你跳过一个可能不存在的值。

可以使用一个变量代替下一个值:

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

6

在 IT 技术中,你应该使用流(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)

1
这只是一个解决方案,如果 OP 正在使用 Java 8,不是吗? - Fildor
2
不确定这是否是一件坏事;Java 8的解决方案应该被视为Java标签上可接受的。点个赞! - Bathsheba
1
我并不是在争论这个问题。只是觉得值得一提的是,特别是初学者可能不知道这个功能仅适用于Java 8及以上版本。 - Fildor
1
但是你在哪里划界呢?例如,泛型是从Java 5开始的。 - Bathsheba
1
值得一提的是,可以使用Objects::nonNull代替film->film!=null - Hulk
显示剩余2条评论

1
你从未提到为什么要明确使用迭代器。为什么不像这样使用隐式迭代器符号?:
for (Film film : filmList) {
  if (film != null ){
     ....
  }
}

1
此外,除了其他人说的之外:如果您正在使用像int这样的基本类型进行for-each循环。
for (int node : input) {
    doSomething(node);
}

你可能想考虑使用包装器类:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接