2015-05-19 36 views
7

java8 forEach yöntemi bir yineleyici kullanıyor mu yoksa gerçekten değil mi? Onu kemiğe yönlendirdim, tam olarak bulamadım. Sadece veriler aynı sırayla tekrarlayacağı gerçeği.Java8 dahili yineleme

Herhangi bir ipucu?

cevap

12

Iterable # forEach öğesinin varsayılan uygulaması yineleyiciye dayalıdır.

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

Ama ArrayList

Buna geçersiz kılınır değil, yineleme kullanır, bu
@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(); 
     } 
    } 

Yani onun uygulanması bağlıdır iç dizisi üzerinde döngü için kullanır.

Her neyse, bu yöntem yinelenen arabirimde bildirildiğinden, tüm yinelemeler bu yönteme sahiptir.

+1

ek olarak: istemciler, temel oluşturan 'Yineleyici'yi kullanmak için herhangi bir' Yinelenen 'uygulamasına güvenmemelidir. Mevcut uygulama olduğunda bile, gelecek sürümleri olmayabilir. – bowmore

+1

Arayan 'forEach' bir' Yineleyici 'kullanıp kullanmayacağını bilmediğinden, tüm nokta olan bir “iç yineleme” dir: yol, yineleme nasıl uygulanır, gizlenir * forEach' uygulaması. – Holger