我们可以使用for-each循环来迭代Iterator类型的对象吗?

ari*_*dam 1 java 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");
     /*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)

Chr*_*ung 6

很多答案都在谈论迭代器如何不是可迭代的。这是真的,但这样的答案并没有涉及为什么。

for-each 循环需要迭代的原因是允许多次遍历同一个对象(以便您可以在同一对象上使用多个 for-each 循环而不会出现令人惊讶的行为),而迭代器只允许一次遍历。如果 for-each 允许使用迭代器,对于那些没有意识到循环运行后迭代器会耗尽的程序员来说,这种行为会令人惊讶。

如果您使用的 API 仅提供迭代器,并且您想使用可迭代对象,则有两种方法可以解决此问题:

  1. 创建一个匿名可迭代类,其iterator()方法调用返回迭代器的 API 函数。这样,每次在可迭代对象上使用 for-each 循环时,都会再次调用该 API 函数,返回一个新的(未耗尽的)迭代器。
  2. 制作一个单程可迭代包装类,它接受一个迭代器并允许一次调用iterator(). 在后续调用中,根据需要抛出AssertionErrorIllegalStateException

  • 结语:https://twitter.com/joshbloch/status/326107593107976192 (2认同)

dan*_*ben 5

for一个例子中的循环期望它reverse(list)是一个集合Iterator,当然它不是.这就是为什么这个例子不起作用的原因.

通常,您只能foreach在实现的类上使用Iterable. Iterator不是这些课程之一.

请参阅http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Iterable.html