Java 为什么我找不到迭代器的值?
为什么此代码不打印带有Java 为什么我找不到迭代器的值?,java,Java,为什么此代码不打印带有“q”的值 Iterator<String> it = ZoneId.getAvailableZoneIds().iterator(); while (it.hasNext()) { if (it.next().contains("q")) System.out.println(it.next()); } 因为您迭代了包含'q'的条目。第一个it.next()移动迭代器并返回对象。然后在if中再次移动迭代器并打印
“q”
的值
Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();
while (it.hasNext()) {
if (it.next().contains("q"))
System.out.println(it.next());
}
因为您迭代了包含
'q'
的条目。第一个it.next()
移动迭代器并返回对象。然后在if
中再次移动迭代器并打印一个元素,该元素在其中包含'q'
的元素之后。每次调用next()
时,您都会读取下一项,但打印时再次调用next()
,因此,您正在打印下一个项目,其中包含q
Java为这种情况提供了方便的语法;foreach循环:
或者最近,流:
ZoneId.getAvailableZoneIds().stream()
.filter(zoneId -> zoneId.contains("q"))
.forEach(System.out::println);
这是因为您调用了两次
next()。每次执行此操作时,都会从迭代器中读取下一个值。看看这个:
Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();
while (it.hasNext()) {
String zoneId = it.next();
if (zoneId.contains("q"))
System.out.println(zoneId);
}
或者,可能使用流
:
ZoneId.getAvailableZoneIds().stream()
.filter(zoneId -> zoneId.contains("q"))
.forEach(System.out::println);
所有代码段的结果都是相同的。提示:每次调用next()
,它都会读取另一个字符串。您正在读取一个字符串,检查它是否包含“q”,然后(如果是)读取下一个字符串并打印出来。。。您希望在循环的每次迭代中调用next()
一次…您要迭代两次。您可以检查“if”中的下一个值,然后取该值之后的值进行打印。
Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();
while (it.hasNext()) {
String zoneId = it.next();
if (zoneId.contains("q"))
System.out.println(zoneId);
}
for (String zoneId : ZoneId.getAvailableZoneIds())
if (zoneId.contains("q"))
System.out.println(zoneId);
ZoneId.getAvailableZoneIds().stream()
.filter(zoneId -> zoneId.contains("q"))
.forEach(System.out::println);