我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?


当前回答

匿名类可以轻松地将Iterator转换为Iterable,并允许您使用Iterable语法(for loops, forEach())。

例如:考虑一个Iterator<T> it

for (T element : new Iterable<T>() {

    @Override
    public Iterator<T> iterator() {
        return it;
    }

}) {
    //do something with `T element`
}

抽象在函数中

static <T> Iterable<T> toIterable(Iterator<T> it) {
    return new Iterable<T>() {

        @Override
        public Iterator<T> iterator() {
            return it;
        }

    };
}

使用

for (T element: toIterable(it) {
...
}

其他回答

问:Iterable和Iterator的区别? 答:

iterable:它与forEach循环相关 iterator: Is与Collection相关

forEach循环的目标元素应该是可迭代的。 我们可以使用Iterator从集合中逐个获取对象

java中存在可迭代对象。ḷang包 java中的迭代器。util包

只包含一个方法迭代器() 包含三个方法hasNext(), next(), remove()

1.5版引入 1.2版引入

大多数java接口以“able”结尾。例如可迭代的、可克隆的、可序列化的、可运行的等等。因此,Iterable是一个接口,它有一个名为iterator()的抽象方法,该方法返回一个iterator对象。

public interface Iterable {
  abstract Iterator<T> iterator(); 
}

迭代器接口有抽象方法“hasNext()”和“next()”。

public interface Iterator {
 abstract boolean hasNext();
 abstract E next();          
}

一个明确的使用是List扩展->Collections Interface->扩展Iterable

List<String> countrylist = new ArrayList<>();
list.add("US");
list.add("China");
list.add("Japan");
list.add("India");

Iterator<String> it = countrylist.iterator();
while (it.hasNext()) {
    String string = it.next();
    System.out.println(string);
}

实现Iterable接口允许一个对象作为foreach语句的目标。

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator是一个接口,它具有迭代元素的实现。Iterable是一个提供迭代器的接口。

最重要的考虑是所讨论的项是否应该能够多次遍历。这是因为你总是可以通过再次调用iterator()来倒带一个Iterable,但是没有办法倒带一个iterator。

正如这里所解释的,“Iterable”被引入是为了能够在foreach循环中使用。实现Iterable接口的类可以被迭代。

Iterator是在Iterable上管理迭代的类。它维护当前迭代中我们所处的状态,并知道下一个元素是什么以及如何获取它。