Menjadi agak baru dalam bahasa Jawa saya mencoba membiasakan diri dengan semua cara (atau setidaknya yang non-patologis) yang orang mungkin beralih melalui daftar (atau mungkin koleksi lain) dan kelebihan atau kekurangan masing-masing.
Diberikan List<E> list
objek, saya tahu cara-cara berikut untuk mengulang semua elemen:
Dasar untuk loop (tentu saja, ada yang setara while
/ do while
loop juga)
// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
Catatan: Seperti yang ditunjukkan @amarseillan, formulir ini adalah pilihan yang buruk untuk iterasi List
, karena implementasi sebenarnya dari get
metode ini mungkin tidak seefisien ketika menggunakan Iterator
. Sebagai contoh, LinkedList
implementasi harus melintasi semua elemen sebelum i untuk mendapatkan elemen ke-i.
Dalam contoh di atas tidak ada cara bagi List
implementasi untuk "menyelamatkan tempatnya" untuk membuat iterasi masa depan lebih efisien. Untuk suatu ArrayList
itu tidak terlalu penting, karena kompleksitas / biaya get
adalah waktu yang konstan (O (1)) sedangkan untuk a LinkedList
apakah sebanding dengan ukuran daftar (O (n)).
Untuk informasi lebih lanjut tentang kompleksitas komputasi dari Collections
implementasi bawaan, lihat pertanyaan ini .
Ditingkatkan untuk loop (dijelaskan dengan baik dalam pertanyaan ini )
for (E element : list) {
// 1 - can call methods of element
// ...
}
Iterator
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}
ListIterator
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
// between element and iter->next()
// 4 - can use iter.set(...) to replace the current element
// ...
}
Java fungsional
list.stream().map(e -> e + 1); // Can apply a transformation function for e
Iterable.forEach , Stream.forEach , ...
(Metode peta dari Stream API Java 8 (lihat jawaban @ i_am_zero).)
Di Java 8 kumpulan kelas yang mengimplementasikan Iterable
(misalnya, semua List
s) sekarang memiliki forEach
metode, yang dapat digunakan sebagai ganti untuk pernyataan loop ditunjukkan di atas. (Ini adalah pertanyaan lain yang memberikan perbandingan yang bagus.)
Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
Apa ada cara lain, jika ada?
(BTW, minat saya sama sekali bukan berasal dari keinginan untuk mengoptimalkan kinerja ; Saya hanya ingin tahu bentuk apa yang tersedia bagi saya sebagai pengembang.)
List
antarmuka khusus?