web-dev-qa-db-ja.com

Iterator.next()が== nullであるかどうかを確認する方法は?

リストの次の要素が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");
            }

しかし、一部の要素が印刷されないため、これは最悪の事態になります。

これは私の反復法/匿名クラスです

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
Lazlow

当然、次のようなコード

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

代わりに?

11
Bathsheba

いいえ、このように機能することはできません。it.next()nullでない場合はit.next()を2回呼び出すため、使用できない値をスキップすることになります。

次のように代わりに変数を使用します。

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

イテレータの代わりにストリームを使用する必要があります。

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)
6
sab

そもそもなぜイテレータを明示的に使用するのかについては言及していません。このような暗黙のイテレータ表記を使用してみませんか? :

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