微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我找不到迭代器的值?

为什么这段代码不打印带有 "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);    

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。