Java 增强的for循环不接受迭代器

Java 增强的for循环不接受迭代器,java,foreach,iteration,Java,Foreach,Iteration,对不起,如果以前有人问过这个问题。我的搜索没有提出任何其他类似的问题。这在Java中让我感到惊讶 显然,增强的for循环只接受java.lang.Iterable的数组或实例。它不接受java.util.Iterator作为要迭代的有效obj引用。例如,Eclipse显示以下代码的错误消息。它说:“只能在java.lang.Iterable的数组或实例上迭代” Set mySet=new HashSet(); mySet.add(“虚拟”); 添加(“测试”); 迭代器字符串=mySet.Ite

对不起,如果以前有人问过这个问题。我的搜索没有提出任何其他类似的问题。这在Java中让我感到惊讶

显然,增强的for循环只接受
java.lang.Iterable
的数组或实例。它不接受
java.util.Iterator
作为要迭代的有效obj引用。例如,Eclipse显示以下代码的错误消息。它说:“只能在java.lang.Iterable的数组或实例上迭代”

Set mySet=new HashSet();
mySet.add(“虚拟”);
添加(“测试”);
迭代器字符串=mySet.Iterator();
for(字符串str:strings){
//进程str值。。。
}
为什么会这样?我想知道为什么增强型for循环设计成这样。尽管迭代器不是集合,但它可以用于从集合一次返回一个元素。请注意,
java.lang.Iterable
接口中唯一的方法是
Iterator Iterator()
,它返回一个
Iterator
。这里,我直接给它一个
迭代器
。我知道可以使用
hasNext()
next()
,但是使用增强的for循环会使它看起来更干净


我现在了解的一件事是,我可以直接在mySet上使用增强的for循环。因此,我甚至不需要额外的调用来获取
迭代器。因此,这将是编写此代码的方法,是的-它确实有一定的意义。

出现错误是因为您试图在迭代器上进行迭代,而不是在列表或集合上进行迭代。如果要使用迭代器,我建议您使用next()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);
}
Set mySet=new HashSet();
mySet.add(“虚拟”);
添加(“测试”);
迭代器字符串=mySet.Iterator();
while(strings.hasNext()){
String temp=strings.next();
系统输出打印项次(温度);
}
Java 5中引入了增强的for循环,作为一种更简单的方法 遍历集合[或数组]的所有元素

迭代器不是元素的集合

它是一个使程序员能够遍历容器的对象。 迭代器可以被认为是指针的一种类型


因此,增强for循环通过遍历包含元素的结构中的所有元素来工作,而迭代器不包含元素,它更像一个指针。

在您的示例中,您正在创建迭代器,但没有正确使用它。关于为什么抛出异常的问题,请回答以下问题:

 for (String str : strings) {
“strings”在这里是一个迭代器,而不是可以迭代的集合。因此,您有几个选项可以通过使用增强的for循环来迭代集合:

for(String myString : mySet){
    //do work
}
或者,您可以使用迭代器对集合进行迭代:

Iterator<String> strings = mySet.iterator();
while(strings.hasNext()){
    //do work
}
Iterator strings=mySet.Iterator();
while(strings.hasNext()){
//工作
}

希望这对您有所帮助。

增强的for循环是其中的一部分。从该页面,您可以下载建议的最终文件草稿,其中包括直接解决您问题的常见问题部分:

附录I.设计常见问题解答

  • 为什么我不能将增强的for语句与迭代器一起使用(而不是 而不是一个可数或数组)
  • 两个原因:(1)该构造不会 如果你有问题的话,在语法方面提供很多改进 代码中的显式迭代器,以及(2)循环的执行 “副作用”是推进(通常是耗尽)工作 迭代器。换句话说,增强的for语句提供了 简单、优雅的解决方案,适用于在 集合或数组,不尝试解决更复杂的问题 使用传统的for语句可以更好地处理这些情况

  • 为什么我不能使用增强型for语句来:
    • 在遍历集合时删除元素(“筛选”)
    • 同时迭代多个集合或数组
    • 是否修改阵列或列表中的当前插槽
  • 见上文第1项。专家组审议了这些案件,但是 选择了一个简单,干净的扩展,剂量(原文如此)一件事好。这个 设计遵循“80-20规则”(它处理80%的案例,20%的案例 努力)。如果一个案例属于其他20%,您始终可以使用 显式迭代器或索引,就像您过去所做的那样


    换句话说,委员会选择了限制提案的范围,而一些人们可以想象成为提案一部分的功能没有被削减。

    解释eclipse警告的可能副本:
    Iterable!=迭代器
    编辑了问题,以解释为什么这不是的副本。还有@gnomed-我知道
    Iterable!=迭代器
    :-)虽然这向询问者展示了如何使用带有
    迭代器
    对象的循环,但它并没有解释增强for循环如何遍历
    集合
    和为什么不能以这种方式应用
    迭代器之间的区别。这不是一个完整的答案。尽管迭代器不是集合,也不包含元素,但它确实可以用于一次返回一个元素,这是增强for循环的基本目的。显然,它知道一个集合。这看起来像是一个设计决策。我想知道为什么会这样@Kenster的答案正是我想要的。请注意Iterable也不是集合或数组。Iterables是带有返回迭代器的方法的东西。我希望至少95%的Iterable实现只返回它们唯一的构造函数参数,以解决
    的增强型
    的这一怪癖。谢谢,Kenster。这就是我想知道的。每个人都想教我什么是错的什么是对的,w
    
    Iterator<String> strings = mySet.iterator();
    while(strings.hasNext()){
        //do work
    }