创建自己的 Iterable

要像使用任何接口一样创建自己的 Iterable,只需在界面中实现抽象方法即可。对于 Iterable,只有一个叫做 iterator()。但它的返回类型 Iterator 本身就是一个有三种抽象方法的接口。你可以返回与某个集合关联的迭代器,也可以创建自己的自定义实现:

public static class Alphabet implements Iterable<Character> {

    @Override
    public Iterator<Character> iterator() {
        return new Iterator<Character>() {
            char letter = 'a';

            @Override
            public boolean hasNext() {
                return letter <= 'z';
            }

            @Override
            public Character next() {
                return letter++;
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Doesn't make sense to remove a letter");
            }
        };
    }
}

使用:

public static void main(String[] args) {
    for(char c : new Alphabet()) {
        System.out.println("c = " + c);
    }
}

新的 Iterator 应该带有指向第一个项目的状态,每次调用 next 都会更新其状态以指向下一个项目。hasNext() 检查迭代器是否在最后。如果迭代器连接到可修改的集合,则可以实现迭代器的可选 remove() 方法,以从基础集合中删除当前指向的项。