Java8内部迭代

Rol*_*all 7 java-8 java-stream

java8 forEach方法是否真的使用迭代器?我把它谷歌到骨头,找不到它.只有它将以相同的顺序迭代数据的事实.

有小费吗?

Eze*_*iel 12

Iterable#forEach的默认实现基于迭代器.

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是在ArrayList中重写了它,并且不使用迭代器,它在其内部数组上使用for循环

    @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以它取决于它的实现.

无论如何,由于此方法在Iterable接口中声明,因此所有迭代都具有此方法.