【问题标题】:How to understand the `Iterable` and `Iterator` in Java? [duplicate]如何理解 Java 中的 `Iterable` 和 `Iterator`? [复制]
【发布时间】: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只是一个接口,接口可以用来做返回值吗?

【问题讨论】:

  • 为什么要扩展 ArrayList?!你不想让ReversedList 成为List 的装饰器吗?
  • @СӏаџԁеМаятіи 我只希望ArrayList 可以从头到尾移动。
  • 大多数人会像这样创建一个交互器:list.listIterator(list.size()); 然后使用previous():while(list.hasPrevious()) { ... list.previous() ... }

标签: java iterator


【解决方案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 我认为在这种情况下没关系,因为整个类只包含这段代码(我假设),所以它不会变得那么混乱。这只是一个可读性的问题:如果有任何东西过于拥挤,你最好将代码分成两个类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2016-08-20
    • 2014-12-22
    • 2013-03-03
    • 2015-12-13
    • 2014-04-29
    • 2011-02-28
    相关资源
    最近更新 更多