# Iterator Interface (Arayüzü)
Iterator interface bizlere veri kümesinde döngü kurabilen bir olanak tanır. Iterable interface ile bir Iteratorâa sahip olabilme iÅlevine sahiptik. Iterator ile ise döngüde elemanlara eriÅim yapabilen bir altyapı kazanıyoruz. Collection interfaceâden türemiÅ alt sınıflarda âiteratorâ fonksiyonunu çaÄırarak bir âIteratorâ nesnesi oluÅturup alıyoruz. Iterator nesnesi o anki veri kümesini dolaÅabilecek iÅleve sahiptir.
Iterator, veri kümesi içindeki elemanları tek tek dolaÅabilmeyi saÄlar. Bu dolaÅma tek yönlüdür. İlk elemandan son elemana doÄrudur. Bu durumu elindeki hasta listesini tek tek dolaÅan bir doktora benzetebilirsiniz. Doktor sabah ilk hastasından son hastasına kadar tümüyle tek tek ilgilenir. Burada Iterator nesnesini doktora benzetip veri kümesi üzerinde dolaÅan bir nesne olarak düÅünebiliriz.
Not: İndeks deÄeri olmayan veri kümelerini indeksli klasik for döngüsüyle gezemeyiz. Bu durumda Iterator nesnesi ile elemanları tek tek dolaÅabiliriz.
Iterator nesnesi aÅaÄıdaki döngü tiplerinde kullanılabilir.
\- while döngüsü (tavsiye edilen)
\- for döngüsü
\- do-while döngüsü
**Iterator interfaceâin fonksiyonları:**
| boolean hasNext() | Iterator ile veri kümesi üzerinde dolaÅırken devam edilebilecek bir sonraki elemanın var olup olmadıÄını true/false Åeklinde belirtir. |
| -------------------------------------------------- | ------------------------------------------------------------ |
| E next(); | Veri kümesindeki bir sonraki elemanı almayı saÄlar. |
| void remove(); | Veri kümesinden bir elemanı silmeyi saÄlar. |
| void forEachRemaining(Consumer super E> action) | Iterator nesnesi veri kümesi üzerinde dolaÅırken o andaki konumundan sonra gelenler üzerinde döngü kurabilmeyi saÄlar. |
Iterator nesnesi bir kere oluÅturulduktan sonra artık veri kümesine ekleme yapılamaz. Veri kümesine ekleme yapıldıktan sonra mutlaka yeni bir Iterator nesnesi oluÅturmak gerekecektir.
```java
List electricalCars = new ArrayList();
electricalCars.add(new ElectricCar("BMW", "34 AL 377", 100));
electricalCars.add(new ElectricCar("Mercedes", "35 Aa 547", 200));
Iterator iteratorObject = electricalCars.iterator();
while(iteratorObject.hasNext())
{
ElectricCar electricCar = iteratorObject.next();
System.out.println(electricCar);
}
```
Yukarıda bir iteratorObject isimli Iterator ile veri kümesi üzerinde while döngüsüyle dolaÅım yapıyoruz. List tipindeki bir listeden âelectricalCars.iterator();â komutuyla iterator nesnesi oluÅturmuÅ oluyoruz. Bu aÅamadan sonra veri kümesine bir ekleme yapılırsa hata alınacaktır.
```java
Iterator iteratorObject = electricalCars.iterator();
electricalCars.add(new ElectricCar("Mercedes", "35 Aa 547", 200));
```
Yukarıda iterator nesnesi oluÅtuktan sonra veri setine yeni bir eleman eklemeye çalıÅtıÄımızda aÅaÄıdaki hatayı alırız.
```java
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at chapter3.generics.Main.main(Main.java:33)
```
Iterator ile döngü esnasında veri kümesinden eleman çıkarabilirsiniz. Normalde bir veri kümesi üzerinde Iterator nesnesi olmaksızın klasik bir döngü ile çalıÅıyorken eleman silme iÅlemi yapamazsınız. Bu durumda yine âConcurrentModificationExceptionâ hatası alırsınız. Bu nedenle döngü içindeyken veri kümesinden eleman silmek istiyorsak Iterator nesnesini kullanmamız gerekir.
```java
List electricalCars = new ArrayList();
electricalCars.add(new ElectricCar("BMW", "34 AL 377", 100));
electricalCars.add(new ElectricCar("Mercedes", "35 Aa 547", 200));
electricalCars.add(new ElectricCar("BMW", "45 AB 547", 200));
Iterator iteratorObject = electricalCars.iterator();
while(iteratorObject.hasNext())
{
ElectricCar electricCar = iteratorObject.next();
if(electricCar.getBrand().equals("BMW")) {
iteratorObject.remove();
}
}
Iterator iteratorObject2 = electricalCars.iterator();
while(iteratorObject2.hasNext())
{
ElectricCar electricCar = iteratorObject2.next();
electricCar.showInfo();
}
```
Yukarıdaki senaryo mülakatlarda da çıkacaktır. Sizlere bir liste verilir ve döngü kurup içinden bazı elemanları silmeniz beklenir. Bu tarz durumlarda bu silme iÅlemini Iterator üzerinden yapabileceÄinizi söylemek gerekiyor. Aynı, Åekilde Iterator nesnesi ile döngü içindeyken yeni bir eleman eklemesi yapamazsınız. Bunu akılda tutmak gerekiyor.
Not: Veri kümemizde çok fazla eleman varsa, binlerce elemanlık bir veri kümesi gibi, Iterator ile while döngüsünü kullanmak performans kazancı saÄlayacaktır.