如何理解Java中的“Iterable”和“Iterator”?
我有以下代码:如何理解Java中的“Iterable”和“Iterator”?,java,iterator,Java,Iterator,我有以下代码: class ReversibleArrayList<T> extends ArrayList<T> { public ReversibleArrayList(Collection<T> c) { super(c); } public Iterable<T> reversed() { return new Iterable<T>() { pu
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();
}
};
}
};
}
}
类reversibleraylist扩展了ArrayList{
公共可撤销租赁清单(集合c){
超级(c);
}
公营机构{
返回新的Iterable(){
公共迭代器迭代器(){
返回新的迭代器(){
int current=size()-1;
@凌驾
公共布尔hasNext(){
返回电流>=0;
}
@凌驾
公共交通工具{
返回get(当前--);
}
@凌驾
公共空间删除(){
抛出新的UnsupportedOperationException();
}
};
}
};
}
}
此代码用于使ArrayList
可以在foreach
中反转
有两个问题:
1、 我不理解方法public Iterable reversed()
,
这个方法的返回值是Iterable
,还有迭代器
2、 我认为,Interable
只是一个接口,接口是否可以用于返回值?reversed()创建并返回新的匿名类(这意味着,它创建了某个未命名类的对象,实现了Iterable),实现了Iterable接口并实现了该接口的方法迭代器()。
是的,接口可以用作返回类型,这是OOP的概念。这意味着该方法可以返回实现此接口的所有内容。确保可以将接口用作返回类型。它只是说,objects类实现了接口,因此它的所有方法都可用。匿名类满足这些方法要求,可以用作返回类型
代码看起来很复杂,因为使用了一个匿名类,并且对象被快速连续地创建和返回
Iterable:
实现此接口允许对象成为“foreach”语句的目标
资料来源:
迭代器:
“[…]迭代器通常指向集合中的单个实例。Iterable意味着可以从对象获取迭代器以遍历其元素,并且不需要迭代单个实例,这就是迭代器所表示的。”
资料来源:PaulJWilliams回答
这对你来说应该很有用为什么你要扩展ArrayList?!你不想ReversedList
成为List
的装饰者吗?@Сӏаџԁаааіааааааіаааіаааааа代码>然后使用previous():而(list.hasPrevious()){…list.previous()…}
匿名类是推荐在java中使用的方法\?可以修改这些代码以更好地理解,例如不使用匿名类?@BlackMamba我认为在这个例子中可以,因为整个类只包含这一段代码(我假设),所以不会变得那么混乱。这只是可读性的问题:如果有什么东西变得过于拥挤,最好将代码分成两个类。