为什么我找不到迭代器的值?

问题描述

为什么这段代码不打印带有 "q" 的值?

Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();

while (it.hasNext()) {
    if (it.next().contains("q"))
         System.out.println(it.next());
}

输出

Pacific/Kwajalein
Etc/GMT-3
America/Martinique
Pacific/Funafuti
Canada/Pacific
Eire
America/Sitka
Brazil/West
US/Aleutian

解决方法

每次调用 next() 时都会读取下一项,但是在打印时又调用了 next() ,因此您正在打印下一项其中有一个 q

Java 为这种情况提供了方便的语法; foreach 循环

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

因为您遍历了包含 'q' 的条目。第一个 it.next() 移动迭代器并返回对象。然后在 if 内再次移动迭代器并打印与 'q' 一个接一个的元素。

,

那是因为您调用了 next() 两次。每次执行此操作时,您都会从 Iterator 读取下一个值。看看这个:

Iterator<String> it = ZoneId.getAvailableZoneIds().iterator();

while (it.hasNext()) {
    String zoneId = it.next();

    if (zoneId.contains("q"))
        System.out.println(zoneId);
}

您可以使用更易读的语法与 for loop 做同样的事情:

for (String zoneId : ZoneId.getAvailableZoneIds())
    if (zoneId.contains("q"))
        System.out.println(zoneId);

或者,可能使用 Stream

ZoneId.getAvailableZoneIds().stream()
      .filter(zoneId -> zoneId.contains("q"))
      .forEach(System.out::println);    

所有片段的结果都是一样的。