如何解决为什么我找不到迭代器的值?
为什么这段代码不打印带有 "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 举报,一经查实,本站将立刻删除。