Apa perbedaan antara iterator dan iterable dan bagaimana menggunakannya?

195

Saya baru di Jawa dan saya benar-benar bingung dengan iterator dan iterable. Adakah yang bisa menjelaskan kepada saya dan memberikan beberapa contoh?

Charles Cai
sumber

Jawaban:

199

An Iterableadalah representasi sederhana dari serangkaian elemen yang dapat diulangi. Itu tidak memiliki keadaan iterasi seperti "elemen saat ini". Sebaliknya, ia memiliki satu metode yang menghasilkan Iterator.

An Iteratoradalah objek dengan status iterasi. Ini memungkinkan Anda memeriksa apakah ada lebih banyak elemen yang digunakan hasNext()dan pindah ke elemen berikutnya (jika ada) menggunakan next().

Biasanya, suatu Iterableharus dapat menghasilkan sejumlah Iterators yang valid .

ColinD
sumber
akankah itu menjadi masalah jika Iterablememiliki interalatau externalmengulangi atau mungkin untuk memilikinya?
sakhunzai
90

Implementasi Iterableadalah yang menyediakan Iteratorsendiri:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

Iterator adalah cara sederhana yang memungkinkan beberapa orang untuk mengulang koleksi data tanpa hak penugasan (meskipun dengan kemampuan untuk menghapus).

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Lihat Javadoc .

Keith Pinson
sumber
16

Saya akan menjawab pertanyaan terutama tentang ArrayList sebagai contoh untuk membantu Anda memahami lebih baik ..

  1. Antarmuka Iterable memaksa subkelasnya untuk mengimplementasikan metode abstrak 'iterator ()'.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Antarmuka Iterator memaksa subkelasnya untuk mengimplementasikan metode abstrak 'hasNext ()' dan 'next ()'.
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList mengimplementasikan Daftar, Daftar memperluas Koleksi dan Koleksi memperluas Iterable .. Artinya, Anda bisa melihat hubungan seperti

    'Iterable <- Koleksi <- Daftar <- ArrayList'

. Dan Iterable, Collection and List hanya mendeklarasikan metode abstrak 'iterator ()' dan ArrayList sendiri yang mengimplementasikannya.

  1. Saya akan menunjukkan kode sumber ArrayList dengan metode 'iterator ()' sebagai berikut untuk informasi lebih rinci.

Metode 'iterator ()' mengembalikan objek kelas 'Itr' yang mengimplementasikan 'Iterator'.

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. Beberapa metode atau kelas lain akan mengulangi elemen koleksi seperti ArrayList melalui penggunaan Iterator (Itr).

Ini adalah contoh sederhana.

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

Sekarang, apakah sudah jelas? :)

JAEMOON HWANG
sumber
Jawaban yang bagus.!
Kavindu Dodanduwa
Saya memahami posting ini, tetapi bagaimana jika saya ingin menulis metode yang tipe pengembaliannya Iterable<T>dalam skenario ini langkah-langkah apa yang perlu kita terapkan? Tolong sarankan contoh itu juga.
Prasanna Sasne
12

Jika koleksi iterable, maka dapat iterasi menggunakan iterator (dan akibatnya dapat digunakan dalam untuk setiap loop.) Iterator adalah objek aktual yang akan beralih melalui koleksi.

dlev
sumber
2
FYI a java.util.Collection selalu mengimplementasikan java.util.Iterable.
Paul Draper
2
Bukan java.lang.Iterable?
ulab
Inijava.lang.Iterable
aldok
9

Menerapkan antarmuka Iterable memungkinkan objek untuk menjadi target pernyataan "foreach".

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator adalah antarmuka, yang memiliki implementasi untuk beralih pada elemen. Iterable adalah antarmuka yang menyediakan Iterator.

Nageswaran
sumber
1
Jika ada kelas yang menerapkan Iterable itu harus memiliki metode Iterator () di dalamnya, benar ??? Koreksi saya jika saya salah.
Chinmaya B
Iya. Seharusnya ada metode antarmuka yang tidak diimplementasikan. Dalam hal ini adalah Iterator.
agent.smith
Terima kasih atas jawaban yang cerdas. Saya datang ke sini untuk mengecek pemahaman saya tentang Iterable vs Iterator. Anda mengkonfirmasinya. Semua jawaban lain berbicara tentang struktur, yang saya kira baik-baik saja, tetapi tidak menjawab pertanyaan MENGAPA saya menggunakan yang lain.
EricGreg
Bagi saya, ini adalah jawaban terbaik.
Sam
Saya ingin tahu apa manfaat Untuk setiap loop untuk String s: someClass. Karena someClass adalah objek kelas java dan s String ref. Dalam situasi apa seseorang harus pergi dengan implementasi semacam itu.
Neeraj
8

Pertimbangan yang paling penting adalah apakah barang yang dimaksud harus dapat dilintasi lebih dari satu kali. Ini karena Anda selalu dapat memundurkan Iterable dengan memanggil iterator () lagi, tetapi tidak ada cara untuk memundurkan Iterator.

Praveen Kishor
sumber
Saya bertanya-tanya mengapa kelas koleksi tidak mengimplementasikan antarmuka Iterator secara langsung (alih-alih mengimplementasikan objek Iterable dan mengembalikan Iterator). Jawaban ini memperjelas bahwa - dalam hal ini tidak mungkin untuk melintasi koleksi beberapa kali (dan juga secara bersamaan oleh banyak utas). Ini jawaban yang sangat penting.
simpleDev
2

Seperti yang dijelaskan di sini , " Iterable " diperkenalkan untuk dapat digunakan dalam foreachloop. Kelas yang mengimplementasikan antarmuka Iterable dapat diulangi.

Iterator adalah kelas yang mengelola iterasi di atas Iterable . Itu mempertahankan keadaan di mana kita berada dalam iterasi saat ini, dan tahu apa elemen berikutnya dan bagaimana mendapatkannya.

Sangeeta
sumber
2

Pertimbangkan contoh memiliki 10 buah apel. Ketika mengimplementasikan Iterable, itu seperti menempatkan setiap apel dalam kotak dari 1 hingga 10 dan mengembalikan iterator yang dapat digunakan untuk bernavigasi.

Dengan menerapkan iterator, kita bisa mendapatkan apel, apel di kotak selanjutnya dll.

Jadi menerapkan iterable memberikan iterator untuk menavigasi elemen-elemennya meskipun untuk menavigasi, iterator perlu diimplementasikan.

Abhishek Malviya
sumber
1

Pertanyaan: Perbedaan antara Iterable dan Iterator?
Jawab:

iterable: Hal ini terkait dengan
iterator forEach loop : Apakah terkait dengan Koleksi

Elemen target dari forEach loop harus digandakan iterable.
Kita dapat menggunakan Iterator untuk mendapatkan objek satu per satu dari Koleksi

Iterable hadir dalam paket java.ḷang
Iterator hadir dalam paket java.util

Hanya mengandung satu metode iterator ()
Berisi tiga metode hasNext (), next (), hapus ()

Diperkenalkan dalam versi 1.5
Diperkenalkan dalam versi 1.2

Rf Khan
sumber
1

Pada dasarnya, keduanya terkait erat satu sama lain.

Pertimbangkan Iterator sebagai antarmuka yang membantu kita dalam menelusuri koleksi dengan bantuan beberapa metode yang tidak ditentukan seperti hasNext (), next () dan hapus ()

Di sisi lain, Iterable adalah antarmuka lain, yang, jika diimplementasikan oleh suatu kelas memaksa kelas untuk menjadi Iterable dan merupakan target untuk setiap konstruksi. Ini hanya memiliki satu metode bernama iterator () yang berasal dari antarmuka Iterator itu sendiri.

Ketika koleksi iterable, maka dapat diulang menggunakan iterator.

Untuk memahami, kunjungi ini:

ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java

Doomed93
sumber
1

Saya tahu ini adalah pertanyaan lama, tetapi bagi siapa pun yang membaca ini yang terjebak dengan pertanyaan yang sama dan yang mungkin kewalahan dengan semua terminologi, inilah analogi sederhana dan bagus untuk membantu Anda memahami perbedaan antara iterables dan iterators:

Pikirkan perpustakaan umum. Sekolah tua Dengan buku kertas. Ya, perpustakaan seperti itu.

Rak yang penuh dengan buku akan seperti sebuah iterable. Anda bisa melihat antrean panjang buku di rak. Anda mungkin tidak tahu berapa banyak, tetapi Anda dapat melihat bahwa itu adalah koleksi buku yang panjang.

Pustakawan akan seperti iterator. Dia dapat menunjuk ke buku tertentu kapan saja. Dia dapat memasukkan / menghapus / memodifikasi / membaca buku di lokasi yang ditunjuknya. Dia menunjuk, secara berurutan, ke setiap buku sekaligus setiap kali Anda berteriak "selanjutnya!" untuk dia. Jadi, Anda biasanya akan bertanya kepadanya: "memiliki Berikutnya?", Dan dia akan berkata "ya", yang Anda katakan "selanjutnya!" dan dia akan menunjuk ke buku berikutnya. Dia juga tahu kapan dia mencapai ujung rak, sehingga ketika Anda bertanya: "Apakah Berikutnya?" dia akan mengatakan "tidak".

Saya tahu ini agak konyol, tapi saya harap ini bisa membantu.

Edgar
sumber
0

Selain jawaban ColinD dan Seeker .

Dalam istilah sederhana, Iterable dan Iterator keduanya adalah antarmuka yang disediakan dalam Java's Framework Framework.

Iterable

Sebuah kelas harus mengimplementasikan antarmuka Iterable jika ingin memiliki untuk-setiap loop untuk beralih ke koleksi. Namun, untuk-setiap loop hanya dapat digunakan untuk menggilir koleksi di arah maju dan Anda tidak akan dapat memodifikasi elemen dalam koleksi ini . Tetapi, jika semua yang Anda inginkan adalah membaca elemen data, maka itu sangat sederhana dan berkat ekspresi lambda Java sering liner. Sebagai contoh:

iterableElements.forEach (x -> System.out.println(x) );

Iterator

Antarmuka ini memungkinkan Anda untuk beralih ke koleksi, mendapatkan dan menghapus elemen-elemennya. Setiap kelas koleksi menyediakan metode iterator () yang mengembalikan iterator ke awal koleksi. Keuntungan dari antarmuka ini lebih dari itu adalah bahwa dengan antarmuka ini Anda dapat menambah, memodifikasi atau menghapus elemen dalam koleksi . Tetapi, mengakses elemen membutuhkan kode yang lebih banyak daripada yang dapat dilakukan. Sebagai contoh:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

Sumber:

  1. Java Doc Iterable
  2. Java Doc Iterator
shahrukhamd
sumber
0

Iterable diperkenalkan untuk digunakan dalam untuk setiap loop di java

public interface Collection<E> extends Iterable<E>  

Iteratoradalah kelas yang mengatur iterasi lebih dari satu Iterable. Itu mempertahankan keadaan di mana kita berada dalam iterasi saat ini, dan tahu apa elemen berikutnya dan bagaimana mendapatkannya.

Ranuj Mahajan
sumber
Selamat datang di SO, Anda selalu dapat mengikuti tur di sini , sehingga jawaban Anda akan lebih bermanfaat dan bersih. Dalam kasus kami, pertanyaannya adalah meminta penjelasan tentang dua kelas, tetapi jawaban Anda cukup membingungkan alih-alih menyelesaikannya. Coba juga untuk tetap memberikan referensi, ketika memposting cuplikan dari sumber yang dikenal / valid / bersertifikat, untuk membuat jawaban Anda lebih konkret.
AntJavaDev