使用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框架。
所以我的问题是,为什么文件列表在第二个循环中为空,当我在第一个循环中没有更改它时?
答案 0 :(得分:3)
Iterable
可能会返回可能无法重复的iterator
。它的界面中没有任何东西说它不能。因此,在您的情况下,Iterable
似乎由图书馆作者设计为仅使用一次。如果要第二次迭代,则需要在自己的结构中存储值。即你可以先做
List<Text> myList = new ArrayList(filelist)