Java迭代器的奇怪行为

时间:2016-01-16 19:41:36

标签: java iterator iterable

使用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:

filelist的类型为Iterable<Text>。我正在使用Hadoop map / reduce框架。

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

1 个答案:

答案 0 :(得分:3)

Iterable可能会返回可能无法重复的iterator。它的界面中没有任何东西说它不能。因此,在您的情况下,Iterable似乎由图书馆作者设计为仅使用一次。如果要第二次迭代,则需要在自己的结构中存储值。即你可以先做

List<Text> myList = new ArrayList(filelist)