如果我们执行以下操作,则会收到错误:
class FGH{
public static Iterator reverse(List list) {
Collections.reverse(list);
return list.iterator();
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("1"); list.add("2"); list.add("3");
/*for(Iterator it:reverse(list))
Iterator it=reverse(list);*/
for (Object obj: reverse(list))
System.out.print(obj + ", ");}}
Run Code Online (Sandbox Code Playgroud)
但是如果我们像这样修改代码我们就不会得到错误,那么它是否意味着我们不能迭代Iterator类型的对象?:
class FGH{
public static Iterator reverse(List list) {
Collections.reverse(list);
return list.iterator();
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("1"); list.add("2"); list.add("3");
Iterator it=reverse(list);
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
}}
Run Code Online (Sandbox Code Playgroud)
很多答案都在谈论迭代器如何不是可迭代的。这是真的,但这样的答案并没有涉及为什么。
for-each 循环需要迭代的原因是允许多次遍历同一个对象(以便您可以在同一对象上使用多个 for-each 循环而不会出现令人惊讶的行为),而迭代器只允许一次遍历。如果 for-each 允许使用迭代器,对于那些没有意识到循环运行后迭代器会耗尽的程序员来说,这种行为会令人惊讶。
如果您使用的 API 仅提供迭代器,并且您想使用可迭代对象,则有两种方法可以解决此问题:
iterator()方法调用返回迭代器的 API 函数。这样,每次在可迭代对象上使用 for-each 循环时,都会再次调用该 API 函数,返回一个新的(未耗尽的)迭代器。iterator(). 在后续调用中,根据需要抛出AssertionError或IllegalStateException。第for一个例子中的循环期望它reverse(list)是一个集合Iterator,当然它不是.这就是为什么这个例子不起作用的原因.
通常,您只能foreach在实现的类上使用Iterable. Iterator不是这些课程之一.
请参阅http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Iterable.html
| 归档时间: |
|
| 查看次数: |
5166 次 |
| 最近记录: |