实现Iterable接口思路,以及和Iterator的关系

首先看Iterable接口类源码

在这里插入图片描述

public interface Iterable<T> {
	Iterator<T> iterator();
	
	default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

	default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

可以看出它有一个返回Iterator的方法iterator();

再看Iterator接口类源码

在这里插入图片描述

public interface Iterator<E> {
	boolean hasNext();
	
	E next();
	default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

那么自己实现Iterable接口,应当实现其Iterator iterator()方法,在里面new出一个对象,该对象继承了Iterator接口。下面以AbstractList类为例(AbstractList的父接口 Collection继承了Iterable接口)代码如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
	public Iterator<E> iterator() {
        return new Itr();
    }
    
	//内部类
	private class Itr implements Iterator<E> {
        int cursor = 0;
        int lastRet = -1;
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size();
        }

        public E next() {
            checkForComodification();
            try {
                int i = cursor;
                E next = get(i);
                lastRet = i;
                cursor = i + 1;
                return next;
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                AbstractList.this.remove(lastRet);
                if (lastRet < cursor)
                    cursor--;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }
        }
}
发布了17 篇原创文章 · 获赞 18 · 访问量 5560

猜你喜欢

转载自blog.csdn.net/Vincentqqqqqqq/article/details/104866867