如何理解 Java 中的 `Iterable` 和 `Iterator`? [复制]
Posted
技术标签:
【中文标题】如何理解 Java 中的 `Iterable` 和 `Iterator`? [复制]【英文标题】:How to understand the `Iterable` and `Iterator` in Java? [duplicate] 【发布时间】:2016-02-23 02:04:23 【问题描述】:我有这些代码:
class ReversibleArrayList<T> extends ArrayList<T>
public ReversibleArrayList(Collection<T> c)
super(c);
public Iterable<T> reversed()
return new Iterable<T>()
public Iterator<T> iterator()
return new Iterator<T>()
int current = size() - 1;
@Override
public boolean hasNext()
return current >= 0;
@Override
public T next()
return get(current--);
@Override
public void remove()
throw new UnsupportedOperationException();
;
;
此代码用于使ArrayList
可以在foreach
中反转。
有两个问题:
1、看不懂方法public Iterable<T> reversed()
,
这个方法的返回值是Iterable
,还有Iterator
。
2、我觉得Interable
只是一个接口,接口可以用来做返回值吗?
【问题讨论】:
这应该对你有用***.com/questions/6863182/… 为什么要扩展 ArrayList?!你不想让ReversedList
成为List
的装饰器吗?
@СӏаџԁеМаятіи 我只希望ArrayList
可以从头到尾移动。
大多数人会像这样创建一个交互器:list.listIterator(list.size());
然后使用previous():while(list.hasPrevious()) ... list.previous() ...
【参考方案1】:
reversed() 创建并返回新的 Anonymous 类(这意味着,它创建了一些实现 Iterable 的未命名类的对象),它实现了 Iterable 接口并实现了该接口的方法 iterator()。 是的,接口可以用作返回类型,这是 OOP 的概念。这意味着该方法可以返回实现此接口的所有内容。
【讨论】:
【参考方案2】:当然可以使用接口作为返回类型。它只是说,对象类实现了接口,因此它的所有方法都可用。匿名类满足这些方法要求,可以用作返回类型。
代码看起来很复杂,因为使用了一个匿名类,并且对象被快速连续地创建和返回。
可迭代:
“实现这个接口允许一个对象成为“foreach”语句的目标。”
来源:http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html
迭代器:
"[...] 迭代器通常指向集合中的单个实例。可迭代意味着可以从对象获取迭代器以遍历其元素 - 并且不需要迭代单个实例,这是迭代器所代表的。”
来源:PaulJWilliams 回答Why is Java's Iterator not an Iterable?
【讨论】:
匿名类是java中推荐使用的方式\?可以修改这些代码以便更好地理解,例如不使用匿名类? @BlackMamba 我认为在这种情况下没关系,因为整个类只包含这段代码(我假设),所以它不会变得那么混乱。这只是一个可读性的问题:如果有任何东西过于拥挤,你最好将代码分成两个类。以上是关于如何理解 Java 中的 `Iterable` 和 `Iterator`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中的 Iterable 的 for 循环中创建一个计数器并获取计数器变量的值
请问java中的Iterator和Iterable有些啥区别啊?