Java 迭代器的奇怪行为

Weird behaviour of Java iterators

我在使用 Java 迭代器时遇到了一个奇怪的问题。

在某个函数中,a 接收到一个名为 filelist 的可迭代对象,然后我执行以下操作:

System.out.println("First iteration:");
for(Text t : filelist) System.out.println(t);
System.out.println("Second iteration:");
for(Text t : filelist) System.out.println(t);

输出为:

First iteration:

file2.txt

file1.txt

file1.txt

Second iteration:

filelistIterable<Text> 类型。我正在使用 Hadoop map/reduce 框架。

所以我的问题是,为什么文件列表在第二个循环中是空的,而我在第一个循环中没有更改它?

Iterable 可能 return iterator 可能 non-reiterable。它的界面上没有任何内容说它不能。因此,在您的情况下, Iterable 似乎是由图书馆作者设计的,只能使用一次。如果要进行第二次迭代,则需要将值存储在自己的结构中。 IE。你可以先做

List<Text> myList = new ArrayList(filelist)