增强的 for 循环不接受 Iterator

Enhanced for-loop does not accept Iterator

如果之前有人问过这个问题,请问。我的搜索没有提出任何其他类似的问题。这是 Java.

让我感到惊讶的事情

显然,增强的 for 循环只接受数组或 java.lang.Iterable 的实例。它不接受 java.util.Iterator 作为迭代的有效对象引用。例如,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 不是集合,但它可用于 return 一次从集合中提取一个元素。请注意,java.lang.Iterable 接口中唯一的方法是 Iterator<T> iterator(),其中 return 是 Iterator。这里,我直接递给它一个Iterator。我知道 hasNext()next() 可以使用,但使用增强的 for 循环使它看起来更干净。

我现在明白的一件事是我可以直接在 mySet 上使用增强的 for 循环。所以我什至不需要额外的电话来获得 Iterator。所以,这就是编写代码的方式,是的 - 它确实有一定道理。

出现错误是因为您试图遍历 Iterator,而不是 列表集合。如果你想使用 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);
}

The enhanced for loop was introduced in Java 5 as a simpler way to iterate through all the elements of a Collection [or an array].

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

迭代器不是元素的集合,

it is an object that enables a programmer to traverse a container. An iterator may be thought of as a type of pointer.

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

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

在您的示例中,您创建了一个迭代器但未正确使用它。至于回答你为什么抛出异常的问题 - 它来自以下行:

 for (String str : strings) {

"strings"这里是迭代器,不是可以遍历的集合。因此,您有几个选项可以通过使用增强的 for 循环遍历集合:

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

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

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

希望这对您有所帮助。

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

Appendix I. Design FAQ

  1. Why can't I use the enhanced for statement with an Iterator (rather than an Iterable or array)?

Two reasons: (1) The construct would not provide much in the way on syntactic improvement if you had an explicit iterator in your code, and (2) Execution of the loop would have the "side effect" of advancing (and typically exhausting) the iterator. In other words, the enhanced for statement provides a simple, elegant, solution for the common case of iterating over a collection or array, and does not attempt to address more complicated cases, which are better addressed with the traditional for statement.

  1. Why can't I use the enhanced for statement to:
    • remove elements as I traverse a collection ("filtering")?
    • simultaneously iterate over multiple collections or arrays?
    • modify the current slot in an array or list?

See Item 1 above. The expert group considered these cases, but opted for a simple, clean extension that dose(sic) one thing well. The design obeys the "80-20 rule" (it handles 80% of the cases with 20% of the effort). If a case falls into the other 20%, you can always use an explicit iterator or index as you've done in the past.

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