2015-05-19 10 views
7

क्या जावा विधि प्रत्येक विधि एक इटरेटर का उपयोग करती है या वास्तव में नहीं? मैं इसे हड्डी में डालता हूं, इसे ठीक से नहीं मिला। केवल तथ्य यह है कि डेटा उसी क्रम में पुन: सक्रिय होगा।जावा 8 आंतरिक पुनरावृत्ति

कोई सुझाव?

उत्तर

12

Iterable # forEach का डिफ़ॉल्ट कार्यान्वयन एक पुनरावर्तक पर आधारित है।

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

लेकिन ArrayList में यह करने के लिए ओवरराइड की गई है, और इटरेटर नहीं का उपयोग करता है, वह अपने आंतरिक सरणी पर पाश के लिए एक का उपयोग करता है

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

तो यह इसके कार्यान्वयन के निर्भर करता है।

वैसे भी, चूंकि इस विधि को इटेरबल इंटरफ़ेस में घोषित किया गया है, इसलिए सभी पुनरावृत्तियों में यह विधि है।

+1

अतिरिक्त रूप से: ग्राहकों को अंतर्निहित 'Iterator' का उपयोग करने के लिए किसी भी 'Iterable' कार्यान्वयन पर भरोसा नहीं करना चाहिए। यहां तक ​​कि जब वर्तमान कार्यान्वयन करता है, भविष्य के संस्करण भी नहीं हो सकते हैं। – bowmore

+1

चूंकि कॉलर को पता नहीं है कि 'के लिए' 'Iterator' का उपयोग करेगा या नहीं, यह एक" आंतरिक पुनरावृत्ति "है क्योंकि यह संपूर्ण बिंदु है: जिस तरह से पुनरावृत्ति लागू किया गया है, * वास्तविक * प्रत्येक के लिए कार्यान्वयन। – Holger