问题描述
为什么这段代码不打印带有 "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);
所有片段的结果都是一样的。