对不起,如果有人问过这个问题。我的搜索没有提出任何其他类似的问题。这让我在Java中感到惊讶。
显然,增强的for循环只接受java.lang.Iterable
的数组或实例。它不接受java.util.Iterator
作为迭代的有效obj引用。例如,Eclipse显示以下代码的错误消息。它说:“只能迭代数组或java.lang.Iterable的实例”
Set<String> mySet = new HashSet<String>();
mySet.add("dummy");
mySet.add("test");
Iterator<String> strings = mySet.iterator();
for (String str : strings) {
// Process str value ...
}
为什么会这样?我想知道为什么增强的for循环被设计为以这种方式工作。虽然Iterator不是集合,但它可以用于从集合中一次返回一个元素。请注意,java.lang.Iterable
界面中唯一的方法是Iterator<T> iterator()
,它返回Iterator
。在这里,我直接递交Iterator
。我知道可以使用hasNext()
和next()
,但使用增强的for循环使其看起来更清晰。
我现在理解的一件事是我可以直接在mySet
上使用增强型for循环。所以我甚至不需要额外的电话来获得Iterator
。所以,这就是编码的方法,是的 - 它确实有道理。
答案 0 :(得分:6)
增强的for循环是在Java 5中引入的一种更简单的方法 遍历Collection [或数组]的所有元素。
http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/enhanced-for-loops.html
迭代器不是元素的集合,
它是一个使程序员能够遍历容器的对象。 迭代器可以被认为是一种指针。
https://en.wikipedia.org/wiki/Iterator
通过遍历包含元素的结构中的所有元素来增强for循环的工作,而迭代器不包含元素,它更像是指针。
答案 1 :(得分:4)
增强的for循环是JSR 201的一部分。在该页面中,您可以下载拟议的最终草案文档,其中包括直接解决您问题的常见问题解答部分:
附录I.设计常见问题
- 为什么我不能使用带迭代器的增强型for语句(相反 比Iterable或数组??
醇>两个原因:(1)构造不会 如果你有一个,那么在句法改进方面提供很多 代码中的显式迭代器,以及(2)循环的执行会 具有推进(并且通常是耗尽)的“副作用” 迭代器。换句话说,增强的for语句提供了一个 简单,优雅,解决迭代的常见情况 集合或数组,并不试图解决更复杂的问题 案例,用传统的陈述更好地解决。
- 为什么我不能使用增强的for语句:
醇>
- 在遍历集合时删除元素(“过滤”)?
- 同时迭代多个集合或数组?
- 修改数组或列表中的当前插槽?
见上文第1项。专家组审议了这些案件,但是 选择了一个简单,干净的扩展,可以很好地服用(sic)一件事。该 设计服从“80-20规则”(它处理80%的案件,20%的案件 努力)。如果案件属于另外20%,您可以随时使用 你过去所做的显式迭代器或索引。
换句话说,委员会选择限制提案的范围,人们可以想象成为提案一部分的一些特征并没有削减。
答案 2 :(得分:1)
在您的示例中,您正在创建迭代器但未正确使用它。至于回答你为什么抛出异常的问题 - 它来自这条线:
for (String str : strings) {
&#34;串&#34;这里是一个迭代器,而不是你可以迭代的集合。因此,您可以使用增强的for循环来迭代整个集合中的一些选项:
for(String myString : mySet){
//do work
}
或者你可以使用迭代器迭代整个集合:
Iterator<String> strings = mySet.iterator();
while(strings.hasNext()){
//do work
}
希望您觉得这很有帮助。
答案 3 :(得分:0)
错误的发生是因为您尝试迭代 Iterator ,而不是 列表 或<强> 集合 即可。如果您想使用 Iterator ,我建议您使用 next() 和 < em> hasNext() 方法:
Set<String> mySet = new HashSet<String>();
mySet.add("dummy");
mySet.add("test");
Iterator<String> strings = mySet.iterator();
while(strings.hasNext()){
String temp = strings.next();
System.out.println(temp);
}