Misalkan kita punya Collection<Foo>
. Apa cara terbaik (terpendek dalam LoC dalam konteks saat ini) untuk mengubahnya Foo[]
? Setiap perpustakaan terkenal diizinkan.
UPD: (satu kasus lagi di bagian ini; tinggalkan komentar jika Anda pikir layak membuat utas lain untuk itu): Bagaimana dengan mentransformasikan Collection<Foo>
ke Bar[]
mana Bar
memiliki konstruktor dengan 1 parameter tipe Foo
yaitu public Bar(Foo foo){ ... }
?
Stream.toArray
API yang ada dari JDK.Jawaban:
Di mana
x
koleksinya:sumber
x.toArray(new Foo[0])
--- dokumentasi : tidak ada waktu untuk membaca ...(new Foo[0])
. Sesuai dengan dokumentasi Collection.toArray, `@param sebuah larik di mana elemen-elemen koleksi ini disimpan, jika itu cukup besar` yang artinya akan menyimpannya langsung di larik baru itu. Jika Anda memberinya ukuran array 0, itu akan membuat array baru, yang berarti Anda memiliki array kecil dan array besar dibuat ketika itu tidak perlu.toArray
membuat array target dari tipe yang benar. Dan dalam hal ini, jujur, saya tidak akan peduli tentang satu array kosong tambahan dalam aplikasi saya. Itu jauh di bawah tingkat kebisingan.new Foo[0]
lebih sederhana "tetapi tidak terbaik (memori)" ... yaitu, saya maksudkan bahwa solusi saya lebih mudah tetapi tidak terbaik (itulah alasan saya menggunakan:
).new Foo[0]
varian diusulkan oleh Carlos tidak menderita masalah ini.Solusi alternatif untuk pertanyaan yang diperbarui menggunakan Java 8:
sumber
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Jika Anda menggunakannya lebih dari sekali atau dalam satu lingkaran, Anda bisa menentukan konstanta
dan lakukan konversi seperti itu
The
toArray
Metode akan mengambil array kosong untuk menentukan jenis yang tepat dari array target dan membuat array baru untuk Anda.Inilah proposal saya untuk pembaruan:
sumber
const
bukan Java!public static final Foo[] FOO = {}
import static
untuk mendapatkannya.Dengan JDK / 11, cara alternatif untuk mengonversi a
Collection<Foo>
menjadiFoo[]
dapat digunakanCollection.toArray(IntFunction<T[]> generator)
sebagai:Sebagaimana dijelaskan oleh @Stuart pada milis (penekanan milik saya), kinerja ini pada dasarnya harus sama dengan yang ada
Collection.toArray(new T[0])
-Implementasi API dalam JDK berbunyi:
Catatan : - Hanya saja penggunaan API akan dipandu bersama dengan ketidakcocokan ke belakang ketika digunakan untuk kode dengan
null
nilai-nilai misalnyatoArray(null)
karena panggilan ini sekarang akan ambigu karena adatoArray(T[] a)
dan akan gagal untuk dikompilasi.sumber
Jika Anda menggunakan Jambu dalam proyek Anda, Anda dapat menggunakan
Iterables::toArray
.sumber
Untuk yang asli, lihat jawaban doublep :
Adapun pembaruan:
sumber
Inilah solusi terakhir untuk kasing di bagian pembaruan (dengan bantuan Koleksi Google):
Tapi, pendekatan kunci di sini disebutkan dalam jawaban doublep (saya lupa
toArray
metode).sumber
new Bar[0]
menghindari masalah.Misalnya, Anda memiliki koleksi ArrayList dengan elemen Kelas siswa:
sumber