如何理解 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&lt;T&gt; 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`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的iterable该怎么理解

Java迭代:Iterator和Iterable接口

如何在 Java 中的 Iterable 的 for 循环中创建一个计数器并获取计数器变量的值

请问java中的Iterator和Iterable有些啥区别啊?

在同一个类中实现 Java Iterator 和 Iterable?

工厂模式案例与理解