リストの次の要素が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(){}
};
}
ヌルプリントは最後の要素でのみ発生しますありがとうございます。
当然、次のようなコード
_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*/
}
_
代わりに?
いいえ、このように機能することはできません。it.next()
がnull
でない場合はit.next()
を2回呼び出すため、使用できない値をスキップすることになります。
次のように代わりに変数を使用します。
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 ){
....
}
}