Java Academy · पाठ

Iterable और Iterator Contracts

Iterable और Iterator interfaces तथा for-each loops के आंतरिक कार्य को समझें।

पाठ 1, कुल 4 में से13 चरण

Iterable और Iterator Contracts, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Iterable और Iterator

Iterable<T> और Iterator<T> वे इंटरफ़ेस हैं जो Java के प्रत्येक-तत्व लूप को सक्षम बनाते हैं। इन्हें समझने से आप अपनी डेटा संरचनाओं को लूप-संगत बना सकते हैं।

Iterable इंटरफ़ेस

Iterable<T> में एक विधि होती है: iterator(), जो एक Iterator<T> लौटाती है। Iterable implementing करने वाला कोई भी वर्ग प्रत्येक-तत्व लूप में उपयोग किया जा सकता है।

// java.lang.Iterable<T>
interface Iterable<T> {
    Iterator<T> iterator();
    // default: forEach, spliterator (Java 8+)
}

// Any class implementing Iterable<T> works in for-each:
class Range implements Iterable<Integer> {
    private final int start, end;
    Range(int start, int end) { this.start = start; this.end = end; }

    public Iterator<Integer> iterator() {
        return new RangeIterator(); // defined separately
    }
}

Iterator इंटरफ़ेस

Iterator<T> में तीन विधियाँ होती हैं: hasNext(), next() और वैकल्पिक remove()।

// java.util.Iterator<T>
interface Iterator<T> {
    boolean hasNext(); // true if more elements
    T next();          // returns next element, advances cursor
    default void remove() { throw new UnsupportedOperationException(); }
}

// How for-each desugars internally:
// for (T item : iterable) { use(item); }
// becomes:
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
    T item = it.next();
    // use(item)
}

प्रत्येक-तत्व लूप का रूपांतरण

प्रत्येक-तत्व लूप, Iterable/Iterator प्रतिरूप के ऊपर लिखा गया वाक्य-विन्यासीय संक्षेप है। इसे समझने से आपको सही तरीके से कस्टम Iterable लिखने में सहायता मिलती है।

List<String> names = List.of("Alice", "Bob", "Charlie");

// For-each (readable way)
for (String name : names) {
    System.out.println(name);
}

// Equivalent explicit form
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    String name = it.next();
    System.out.println(name);
}

Iterator की स्थिति-सूचक अवस्था

एक Iterator एक स्थिति-सूचक बनाए रखता है — यह अनुक्रम में एक स्थिति होती है। next() को कॉल करने पर स्थिति-सूचक आगे बढ़ता है। एक बार पूरा हो जाने के बाद, Iterator को फिर से आरंभ नहीं किया जा सकता।

List<Integer> nums = List.of(1, 2, 3);
Iterator<Integer> it = nums.iterator();

System.out.println(it.hasNext()); // true
System.out.println(it.next());    // 1
System.out.println(it.next());    // 2
System.out.println(it.next());    // 3
System.out.println(it.hasNext()); // false

try {
    it.next(); // NoSuchElementException
} catch (java.util.NoSuchElementException e) {
    System.out.println("No more elements!");
}

ConcurrentModificationException

स्पष्ट Iterator से पुनरावृत्ति करते समय संग्रह में बदलाव करने पर (Iterator.remove() के बाहर) ConcurrentModificationException उत्पन्न होता है।

List<String> list = new ArrayList<>(List.of("a", "b", "c", "d"));

// BAD: modifying collection during for-each
try {
    for (String s : list) {
        if ("b".equals(s)) list.remove(s); // ConcurrentModificationException!
    }
} catch (java.util.ConcurrentModificationException e) {
    System.out.println("Cannot modify during iteration!");
}

// GOOD: use Iterator.remove()
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if ("b".equals(it.next())) it.remove(); // safe
}
System.out.println(list); // [a, c, d]

एकाधिक इटरेटर

iterator() को कॉल करने पर हर बार एक नया, स्वतंत्र इटरेटर लौटता है। एक ही संग्रह पर एक साथ कई इटरेटर सक्रिय हो सकते हैं।

List<Integer> nums = List.of(1, 2, 3);

Iterator<Integer> a = nums.iterator();
Iterator<Integer> b = nums.iterator();

System.out.println(a.next()); // 1
System.out.println(b.next()); // 1 (independent cursor)
System.out.println(a.next()); // 2
System.out.println(b.next()); // 2

Iterable बनाम Iterator

मुख्य अंतर:

  • Iterable: ऐसा स्रोत जो इटरेटर बना सकता है — जिस पर कई बार पुनरावृत्ति की जा सकती है
  • Iterator: किसी अनुक्रम पर चलने वाला स्थिति-सूचक — एकबारगी उपयोग योग्य और अवस्था-संपन्न
// Iterable: reusable
List<String> list = List.of("x", "y");
for (String s : list) {} // OK
for (String s : list) {} // OK again — new iterator each time

// Iterator: single-use
Iterator<String> it = list.iterator();
while (it.hasNext()) it.next();
// for (String s : it) {} // compile error — Iterator is not Iterable!

व्यावहारिक: कस्टम फ़ाइल-पंक्ति Iterable

एक ऐसा फ़ाइल पाठक जो Iterable लागू करता है, ताकि उसकी पंक्तियों पर प्रत्येक-तत्व लूप चलाया जा सके।

import java.io.*;
import java.util.*;

class FileLines implements Iterable<String>, Closeable {
    private final BufferedReader reader;

    FileLines(String path) throws IOException {
        this.reader = new BufferedReader(new FileReader(path));
    }

    public Iterator<String> iterator() {
        return new Iterator<>() {
            private String nextLine = readNext();

            private String readNext() {
                try { return reader.readLine(); }
                catch (IOException e) { return null; }
            }

            public boolean hasNext() { return nextLine != null; }
            public String next() {
                String curr = nextLine;
                nextLine = readNext();
                return curr;
            }
        };
    }

    public void close() throws IOException { reader.close(); }
}

forEach डिफ़ॉल्ट विधि

Java 8 ने Iterable में एक डिफ़ॉल्ट forEach(Consumer) विधि जोड़ी। यह स्पष्ट लूप लिखने का सुविधाजनक विकल्प है।

List<String> cities = List.of("New York", "London", "Tokyo");

// for-each loop
for (String city : cities) System.out.println(city);

// forEach with lambda
cities.forEach(city -> System.out.println(city));

// forEach with method reference (most concise)
cities.forEach(System.out::println);

// For transforming: use stream
cities.stream()
    .map(String::toUpperCase)
    .forEach(System.out::println);

व्यवहार में Iterator प्रतिरूप

Iterable/Iterator लागू करने के उपयोग के संक्षिप्त उदाहरण:

  • कस्टम डेटा संरचनाएँ (वृक्ष, ग्राफ, लिंक्ड सूची)
  • ऐसे विलंबित अनुक्रम जो आवश्यकता पड़ने पर तत्व बनाते हैं
  • संसाधन-आधारित अनुक्रम (फ़ाइल की पंक्तियाँ, डेटाबेस स्थिति-सूचक, संदेश कतार)

त्वरित जाँच

प्रत्येक-तत्व लूप से पुनरावृत्ति करते समय संग्रह में बदलाव करने पर कौन-सा अपवाद उत्पन्न होता है?

पुनरावलोकन: Iterable और Iterator अनुबंध

मुख्य बातें:

  • Iterable<T> में एक विधि होती है: iterator() — प्रत्येक-तत्व लूप का समर्थन सक्षम करती है
  • Iterator<T> में hasNext(), next() और वैकल्पिक remove() होते हैं
  • प्रत्येक-तत्व लूप, Iterable/Iterator प्रतिरूप के ऊपर लिखा गया वाक्य-विन्यासीय संक्षेप है
  • स्वतंत्र नए स्थिति-सूचक पाने के लिए iterator() को कई बार कॉल करें
  • प्रत्येक-तत्व लूप के दौरान संग्रह में कभी बदलाव न करें — इसके बजाय Iterator.remove() का उपयोग करें
  • प्रत्येक-तत्व लूप का समर्थन करने के लिए कस्टम डेटा संरचनाओं में Iterable लागू करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “Iterable और Iterator Contracts” पाठ निःशुल्क है?

हाँ—“Iterable और Iterator Contracts” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Iterable और Iterator Contracts” में मैं क्या सीखूँगा?

Iterable और Iterator interfaces तथा for-each loops के आंतरिक कार्य को समझें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“Iterable और Iterator Contracts” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Iterable और Iterator Contracts
  2. Custom Iterator लागू करना
  3. ListIterator और Bidirectional Traversal
  4. Fail-Fast बनाम Fail-Safe Iterators
← Java Academy पर वापस जाएँ