繁体   English   中英

增强的for循环不接受Iterator

[英]Enhanced for-loop does not accept Iterator

如果有人问过这个问题,请原谅。 我的搜索没有提出任何其他类似的问题。 这让我在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 所以,这将是对此进行编码的方式,是的 - 它确实有意义。

在Java 5中引入了增强的for循环作为迭代Collection [或数组]的所有元素的简单方法。

http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/enhanced-for-loops.html

迭代器不是元素的集合,

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

https://en.wikipedia.org/wiki/Iterator

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

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

附录I.设计常见问题

  1. 为什么我不能将增强型for语句与Iterator(而不是Iterable或数组)一起使用?

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

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

见上文第1项。 专家组考虑了这些案例,但选择了一个简单,干净的扩展,这样做(sic)很好。 该设计遵循“80-20规则”(它处理80%的案例,占20%的努力)。 如果一个案例属于另外20%,你可以像过去一样使用显式迭代器或索引。

换句话说,委员会选择限制提案的范围,并且人们可以想象成为提案的一部分的一些特征没有削减。

在您的示例中,您正在创建迭代器但未正确使用它。 至于回答你为什么抛出异常的问题 - 这是从线上:

 for (String str : strings) {

“strings”在这里是一个迭代器,而不是你可以迭代的集合。 因此,您可以使用增强的for循环来迭代整个集合中的一些选项:

for(String myString : mySet){
    //do work
}

或者您可以使用迭代器遍历集合:

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

希望你觉得这很有帮助。

出现错误的原因是您尝试迭代Iterator ,而不是ListCollection 如果你想使用Iterator ,我建议你使用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM