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);