Java8内部迭代

时间:2015-05-19 16:40:41

标签: java-8 java-stream

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

任何提示?

1 个答案:

答案 0 :(得分:12)

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

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

但是在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();
        }
    }

所以这取决于它的实现。

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