如何检查 Iterator.next() 是否为 == null?
How to check if Iterator.next() is == 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");
}
但这只会让情况变得更糟,因为有些元素甚至不打印!
这是我的迭代method/anonymousclass
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(){}
};
}
null 打印只发生在最后一个元素
谢谢。
自然地,代码像
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*/
}
而不是?
不,它不能以这种方式工作,因为如果 it.next()
不是 null
,您调用 it.next()
两次,这将使您跳过一个甚至不可用的值。
使用变量代替下一个:
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 ){
....
}
}
除其他人所说的之外:如果您正在使用 原始类型 进行 for-each 循环,例如 int
for (int node : input) {
doSomething(node);
}
您可能要考虑使用 Wrapper class 代替:
for (Integer node : input) {
if (node == null) throw new IllegalArgumentException();
doSomething(node);
}
如何检查列表中的下一个元素是否为空?
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");
}
但这只会让情况变得更糟,因为有些元素甚至不打印!
这是我的迭代method/anonymousclass
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(){}
};
}
null 打印只发生在最后一个元素 谢谢。
自然地,代码像
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*/
}
而不是?
不,它不能以这种方式工作,因为如果 it.next()
不是 null
,您调用 it.next()
两次,这将使您跳过一个甚至不可用的值。
使用变量代替下一个:
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 ){
....
}
}
除其他人所说的之外:如果您正在使用 原始类型 进行 for-each 循环,例如 int
for (int node : input) {
doSomething(node);
}
您可能要考虑使用 Wrapper class 代替:
for (Integer node : input) {
if (node == null) throw new IllegalArgumentException();
doSomething(node);
}