Jika saya memiliki koleksi, seperti Collection<String> strs
, bagaimana saya bisa mengeluarkan barang pertama? Saya bisa memanggil Iterator
, mengambil yang pertama next()
, lalu membuangnya Iterator
. Apakah ada cara yang kurang boros untuk melakukannya?
java
collections
iterable
Nick Heiner
sumber
sumber
Jawaban:
Iterables.get (yourC, indexYouWant)
Karena sungguh, jika Anda menggunakan Koleksi, Anda harus menggunakan Google Koleksi.
sumber
Sepertinya itu adalah cara terbaik untuk melakukannya:
Pertanyaan yang bagus ... Pada awalnya, ini kelihatannya merupakan kekeliruan untuk
Collection
antarmuka.Perhatikan bahwa "pertama" tidak akan selalu mengembalikan hal pertama yang Anda masukkan ke dalam koleksi, dan mungkin hanya masuk akal untuk koleksi yang dipesan. Mungkin itu sebabnya tidak ada
get(item)
panggilan, karena pesanan belum tentu terpelihara.Meskipun mungkin tampak sedikit sia-sia, itu mungkin tidak seburuk yang Anda pikirkan.
Iterator
Benar - benar hanya berisi informasi pengindeksan ke dalam koleksi, bukan biasanya salinan seluruh koleksi. Meminta metode ini membuat instantiateIterator
objek, tetapi itu benar-benar satu-satunya overhead (tidak seperti menyalin semua elemen).Sebagai contoh, melihat jenis yang dikembalikan oleh
ArrayList<String>.iterator()
metode, kita melihat bahwa itu adalahArrayList::Itr
. Ini adalah kelas internal yang hanya mengakses elemen daftar secara langsung, daripada menyalinnya.Pastikan Anda memeriksa pengembalian
iterator()
karena mungkin kosong ataunull
tergantung pada implementasinya.sumber
Di java 8:
Untuk versi java yang lebih lama, ada metode getFirst di Guava Iterables :
sumber
getFirst
metode yang tersedia. Adaget
dangetLast
metodeTidak ada yang namanya "pertama" item dalam
Collection
karena itu .. yah hanya koleksi.Dari metode Java doc's Collection.iterator () :
Jadi kamu tidak bisa.
Jika Anda menggunakan antarmuka lain seperti Daftar , Anda dapat melakukan hal berikut:
Tetapi langsung dari Koleksi ini tidak mungkin.
sumber
get(int n)
didefinisikan untukCollection
Sepertinya Koleksi Anda ingin seperti Daftar, jadi saya sarankan:
sumber
Di Java 8 Anda memiliki beberapa operator untuk digunakan, misalnya batas
sumber
Jambu menyediakan
onlyElement
Collector
, tetapi hanya menggunakannya jika Anda mengharapkan koleksi memiliki tepat satu elemen.Jika Anda tidak yakin dengan berapa banyak elemen yang ada, gunakan
findFirst
.sumber
Anda bisa melakukan casting. Misalnya, jika ada satu metode dengan definisi ini, dan Anda tahu bahwa metode ini mengembalikan Daftar:
Dan setelah memintanya, Anda perlu elemen pertama, Anda bisa melakukannya seperti ini:
sumber
Jika Anda tahu bahwa koleksi tersebut adalah antrian maka Anda dapat melemparkan koleksi ke antrian dan mendapatkannya dengan mudah.
Ada beberapa struktur yang bisa Anda gunakan untuk mendapatkan pesanan, tetapi Anda harus menggunakan itu.
sumber
Ini benar-benar tergantung pada implementasi mana yang Anda gunakan, apakah arraylist linkedlist, atau implementasi set lainnya.
jika diatur maka Anda bisa langsung mendapatkan elemen pertama, mereka bisa menjadi trik loop di atas koleksi, membuat variabel nilai 1 dan mendapatkan nilai ketika nilai flag 1 setelah itu istirahat loop itu.
jika implementasi daftar maka mudah dengan mendefinisikan nomor indeks.
sumber
Cara fungsional:
cuplikan kode di atas tersimpan dari NullPointerException dan IndexOutOfBoundsException
sumber
List<T>
tidak memenuhi kondisi yang harus bekerja untukCollection<String>
, tapi tentu saja yang bisa diperbaiki menggunakanCollection<T>
, dengan perubahan tambahan:.map(Collection::stream)
.Anda bisa melakukan ini:
Javadoc for Collection memberikan perintah peringatan elemen elemen berikut:
sumber