Iterable ve Iterator Sözleşmeleri
Iterable ve Iterator arayüzlerini ve for-each döngülerinin içeride nasıl çalıştığını anlayın.
Iterable ve Iterator Sözleşmeleri, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Iterable ve Iterator
Iterable<T> ve Iterator<T>, Java'nın for-each döngüsünü sağlayan arayüzlerdir. Bunları anlamanız, kendi veri yapılarınızı döngülerle uyumlu hâle getirmenizi sağlar.
Iterable Arayüzü
Iterable<T> tek bir yönteme sahiptir: bir Iterator<T> döndüren iterator(). Iterable uygulayan herhangi bir sınıf, for-each döngüsünde kullanılabilir.
// 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 Arayüzü
Iterator<T> üç yönteme sahiptir: hasNext(), next() ve isteğe bağlı 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)
}For-Each Döngüsünün Açılımı
For-each döngüsü, Iterable/Iterator kalıbının sözdizimsel kısaltmasıdır. Bunu anlamanız, özel Iterable uygulamalarını doğru yazmanıza yardımcı olur.
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 İmleç Durumu
Bir Iterator, dizideki bir konumu gösteren bir imleç tutar. next() çağrıldığında imleç ileriye taşınır. Tüm öğeler tüketildiğinde Iterator yeniden başlatılamaz.
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
Açık bir Iterator ile gezinirken bir koleksiyonu değiştirmek (Iterator.remove() dışında) ConcurrentModificationException hatası oluşturur.
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]Birden Çok Iterator
iterator() çağrılarının her biri yeni ve bağımsız bir Iterator döndürür. Aynı koleksiyon üzerinde aynı anda birden çok Iterator etkin olabilir.
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()); // 2Iterable ve Iterator Karşılaştırması
Temel ayrım:
- Iterable: Iterator üretebilen kaynak; birden çok kez üzerinde gezinilebilir
- Iterator: bir dizi üzerindeki imleç; tek kullanımlık ve durum bilgisine sahip
// 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!Pratik: Özel Dosya Satırı Iterable'ı
Satırları üzerinde for-each döngüsüyle gezinmeye olanak tanımak için Iterable uygulayan bir dosya okuyucu.
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(); }
}Varsayılan forEach Yöntemi
Java 8, Iterable'a varsayılan bir forEach(Consumer) yöntemi ekledi. Bu, açık döngüler yazmaya kullanışlı bir alternatiftir.
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);Uygulamada Iterator Kalıbı
Iterable/Iterator uygulamanın uygun olduğu durumların özeti:
- Özel veri yapıları (ağaç, Graph, bağlı liste)
- Öğeleri gerektiğinde üreten tembel diziler
- Kaynak tabanlı diziler (dosya satırları, veritabanı imleci, ileti kuyruğu)
Hızlı Kontrol
For-each döngüsüyle gezinirken bir koleksiyonu değiştirirseniz hangi hata oluşturulur?
Özet: Iterable ve Iterator Sözleşmeleri
Temel çıkarımlar:
- Iterable<T> tek bir yönteme sahiptir: iterator() — for-each döngüsü desteği sağlar
- Iterator<T> hasNext(), next() ve isteğe bağlı remove() yöntemlerine sahiptir
- For-each döngüsü, Iterable/Iterator kalıbının sözdizimsel kısaltmasıdır
- Bağımsız ve yeni imleçler almak için iterator() yöntemini birden çok kez çağırın
- For-each sırasında bir koleksiyonu hiçbir zaman değiştirmeyin; bunun yerine Iterator.remove() kullanın
- Özel veri yapılarına for-each döngüsü desteği sağlamak için Iterable uygulayın
Sıkça Sorulan Sorular
“Iterable ve Iterator Sözleşmeleri” dersi ücretsiz mi?
Evet — “Iterable ve Iterator Sözleşmeleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Iterable ve Iterator Sözleşmeleri” dersinde ne öğreneceğim?
Iterable ve Iterator arayüzlerini ve for-each döngülerinin içeride nasıl çalıştığını anlayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Iterable ve Iterator Sözleşmeleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Iterable ve Iterator Sözleşmeleri
- Özel Bir Iterator Uygulama
- ListIterator ve Çift Yönlü Gezinme
- Fail-Fast ve Fail-Safe Yineleyiciler