Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java8 internal iteration

Does java8 forEach method use an iterator or not really? I google it to the bone, could not find it precisely. Only the fact that it will iterate in the same order the data are.

Any tips?

like image 752
Rollerball Avatar asked May 19 '15 16:05

Rollerball


1 Answers

The default implementation of Iterable#forEach is based on a iterator.

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

But in ArrayList is overridden to this, and not uses the iterator, it uses a for loop over its internal array

    @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();
        }
    }

So it depends of its implementation.

Anyway, since this method is declared in Iterable interface, all iterables has this method.

like image 51
Ezequiel Avatar answered Oct 28 '22 17:10

Ezequiel