增强型for循环不接受迭代器

时间:2015-07-10 18:39:45

标签: java foreach iteration

对不起,如果有人问过这个问题。我的搜索没有提出任何其他类似的问题。这让我在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。所以,这就是编码的方法,是的 - 它确实有道理。

4 个答案:

答案 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.设计常见问题

     
      
  1. 为什么我不能使用带迭代器的增强型for语句(相反   比Iterable或数组??
  2.         

    两个原因:(1)构造不会   如果你有一个,那么在句法改进方面提供很多   代码中的显式迭代器,以及(2)循环的执行会   具有推进(并且通常是耗尽)的“副作用”   迭代器。换句话说,增强的for语句提供了一个   简单,优雅,解决迭代的常见情况   集合或数组,并不试图解决更复杂的问题   案例,用传统的陈述更好地解决。

         
        
    1. 为什么我不能使用增强的for语句:      
          
      • 在遍历集合时删除元素(“过滤”)?
      •   
      • 同时迭代多个集合或数组?
      •   
      • 修改数组或列表中的当前插槽?
      •   
    2.         

      见上文第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);
}