Telah membuat jawaban ini dengan pendekatan yang diperbarui dengan JDK-11 yang memperkenalkan API baru dengan kinerja yang sama toArray(T[])dan serupa dalam sintaksisnya Stream.toArray.
Naman
Jawaban:
1791
List<String> list =..;String[] array = list.toArray(newString[0]);
Sebagai contoh:
List<String> list =newArrayList<String>();//add some stuff
list.add("android");
list.add("apple");String[] stringArray = list.toArray(newString[0]);
The toArray()Metode tanpa melewati setiap argumen kembali Object[]. Jadi, Anda harus melewatkan array sebagai argumen, yang akan diisi dengan data dari daftar, dan dikembalikan. Anda dapat melewatkan array kosong juga, tetapi Anda juga dapat melewatkan array dengan ukuran yang diinginkan.
Pembaruan penting : Awalnya kode di atas digunakan new String[list.size()]. Namun, blogpost ini mengungkapkan bahwa karena optimasi JVM, menggunakan new String[0]lebih baik sekarang.
Ternyata menyediakan array panjang nol, bahkan membuat dan membuangnya, rata-rata lebih cepat daripada mengalokasikan array dengan ukuran yang tepat. Untuk tolok ukur dan penjelasan, lihat di sini: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks
2
(Maaf. Pertanyaan retoris. Jawabannya, tentu saja, karena Java tidak melakukan generik nyata; sebagian besar hanya memalsukan mereka dengan melemparkan Object)
Nyerguds
3
@lyuboslavkanev Masalahnya adalah memiliki tipe generik di Java tidak cukup untuk benar-benar membuat objek berdasarkan tipe itu; bahkan bukan array (yang konyol, karena itu harus bekerja untuk semua jenis). Yang bisa dilakukan dengan itu, sejauh yang saya bisa lihat, adalah casting. Bahkan, untuk bahkan membuat objek dari tipe, Anda harus memiliki Classobjek yang sebenarnya , yang tampaknya sama sekali tidak mungkin untuk diturunkan dari tipe generik. Alasan untuk ini, seperti yang saya katakan, adalah bahwa seluruh konstruksi palsu; itu semua hanya disimpan sebagai Object secara internal.
Saya lebih suka sintaks itu, tetapi IntelliJ menampilkan kesalahan kompiler dengan itu, mengeluh "T [] bukan antarmuka fungsional."
Glen Mazza
3
@GlenMazza hanya dapat Anda gunakan toArraypada Streamobjek. Kesalahan kompilasi ini dapat terjadi jika Anda mengurangi aliran menggunakan Collectorsdan kemudian mencoba menerapkan toArray.
Udara Bentota
39
Anda dapat menggunakan toArray()metode ini untuk List:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array = list.toArray(newString[list.size()]);
Atau Anda dapat secara manual menambahkan elemen ke array:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array =newString[list.size()];for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}
List<String> list =List.of("x","y","z");String[] arrayBeforeJDK11 = list.toArray(newString[0]);String[] arrayAfterJDK11 = list.toArray(String[]::new);// similar to Stream.toArray
Ini berfungsi, tetapi tidak super efisien, dan fungsi duplikat dalam jawaban yang diterima dengan kode tambahan.
Alan Delimon
5
dalam hal beberapa manipulasi ekstra dari data yang diinginkan, di mana pengguna menginginkan suatu fungsi, pendekatan ini tidak sempurna (karena membutuhkan melewati kelas elemen sebagai parameter kedua), tetapi berfungsi:
Jika aplikasi Anda sudah menggunakan lib Apache Commons, Anda dapat sedikit memodifikasi jawaban yang diterima untuk tidak membuat array kosong baru setiap kali:
List<String> list =..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);
Ada beberapa array kosong yang telah dialokasikan sebelumnya dari berbagai jenis di ArrayUtils.
Kita juga bisa menipu JVM untuk membuat array kosong untuk kita dengan cara ini:
String[] array = list.toArray(ArrayUtils.toArray());// or if using static importString[] array = list.toArray(toArray());
Tapi benar-benar tidak ada keuntungan dengan cara ini, hanya masalah selera, IMO.
Saya menurunkan suara karena: 1. tidak ada penggunaan obat generik yang memaksa Anda 2. menggunakan di .toString()mana tidak ada pemeran eksplisit yang diperlukan, 3. Anda bahkan tidak menambah i, dan 4. whileakan lebih baik digantikan oleh a for. Kode yang disarankan:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire
Oke, saya mengerti sekarang. Terima kasih.
Vatsal Chavda
Yah, idealnya, Anda harus mengedit kode Anda untuk memasukkan komentar-komentar itu (yaitu ... jika Anda pikir itu bagus untuk jawaban Anda!). Saya tidak akan mempertimbangkan menghapus downvote saya sementara kode tetap tidak berubah.
Olivier Grégoire
Saya baru di sini, jadi saya belum tahu bagaimana cara kerjanya di sini. Meskipun, hargai bantuan teman Anda.
Vatsal Chavda
Ini jauh lebih baik! Saya telah mengedit sedikit, tetapi Anda baru saja mengalami bagaimana cara kerjanya: memberikan jawaban, meningkatkannya, dapatkan kemenangan;)
Olivier Grégoire
5
Di Java 11, kita bisa menggunakan Collection.toArray(generator)metode ini. Kode berikut akan membuat array string baru:
List<String> list =List.of("one","two","three");String[] array = list.toArray(String[]::new)
List<String> list =newArrayList<>();
list.add("a");
list.add("b");
list.add("c");String[] strArry= list.stream().toArray(size ->newString[size]);
Per komentar, saya telah menambahkan paragraf untuk menjelaskan cara kerja konversi. Pertama, Daftar dikonversi ke aliran String. Kemudian ia menggunakan Stream.toArray untuk mengonversi elemen dalam aliran ke Array. Dalam pernyataan terakhir di atas "size -> new String [size]" sebenarnya adalah fungsi IntFunction yang mengalokasikan array String dengan ukuran stream String. Pernyataan itu identik dengan
toArray(T[])
dan serupa dalam sintaksisnyaStream.toArray
.Jawaban:
Sebagai contoh:
The
toArray()
Metode tanpa melewati setiap argumen kembaliObject[]
. Jadi, Anda harus melewatkan array sebagai argumen, yang akan diisi dengan data dari daftar, dan dikembalikan. Anda dapat melewatkan array kosong juga, tetapi Anda juga dapat melewatkan array dengan ukuran yang diinginkan.Pembaruan penting : Awalnya kode di atas digunakan
new String[list.size()]
. Namun, blogpost ini mengungkapkan bahwa karena optimasi JVM, menggunakannew String[0]
lebih baik sekarang.sumber
Class
objek yang sebenarnya , yang tampaknya sama sekali tidak mungkin untuk diturunkan dari tipe generik. Alasan untuk ini, seperti yang saya katakan, adalah bahwa seluruh konstruksi palsu; itu semua hanya disimpan sebagai Object secara internal.Alternatif di Java 8:
Java 11+:
sumber
toArray
padaStream
objek. Kesalahan kompilasi ini dapat terjadi jika Anda mengurangi aliran menggunakanCollectors
dan kemudian mencoba menerapkantoArray
.Anda dapat menggunakan
toArray()
metode ini untukList
:Atau Anda dapat secara manual menambahkan elemen ke array:
Semoga ini membantu!
sumber
Menggunakan copyOf, ArrayList ke array mungkin juga dilakukan.
sumber
Mulai dari Java-11, seseorang dapat menggunakan API sebagai alternatif
Collection.toArray(IntFunction<T[]> generator)
untuk mencapai hal yang sama seperti:sumber
Di Jawa 8:
sumber
parallelStream()
bukannya sederhanastream()
?Di Java 8, itu bisa dilakukan menggunakan
sumber
Generik solusi untuk rahasia setiap
List<Type>
keString []
:Catatan Anda harus
override toString()
metode.sumber
sumber
dalam hal beberapa manipulasi ekstra dari data yang diinginkan, di mana pengguna menginginkan suatu fungsi, pendekatan ini tidak sempurna (karena membutuhkan melewati kelas elemen sebagai parameter kedua), tetapi berfungsi:
import java.util.ArrayList; import java.lang.reflect.Array;
sumber
Jika aplikasi Anda sudah menggunakan lib Apache Commons, Anda dapat sedikit memodifikasi jawaban yang diterima untuk tidak membuat array kosong baru setiap kali:
Ada beberapa array kosong yang telah dialokasikan sebelumnya dari berbagai jenis di
ArrayUtils
.Kita juga bisa menipu JVM untuk membuat array kosong untuk kita dengan cara ini:
Tapi benar-benar tidak ada keuntungan dengan cara ini, hanya masalah selera, IMO.
sumber
Anda dapat menggunakan
Iterator<String>
untuk mengulangi elemen-elemen dariArrayList<String>
:Sekarang Anda dapat mengambil kembali elemen dari
String[]
menggunakan Loop apa pun.sumber
.toString()
mana tidak ada pemeran eksplisit yang diperlukan, 3. Anda bahkan tidak menambahi
, dan 4.while
akan lebih baik digantikan oleh afor
. Kode yang disarankan:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Di Java 11, kita bisa menggunakan
Collection.toArray(generator)
metode ini. Kode berikut akan membuat array string baru:dari java.base's
java.util.Collection.toArray()
.sumber
Per komentar, saya telah menambahkan paragraf untuk menjelaskan cara kerja konversi. Pertama, Daftar dikonversi ke aliran String. Kemudian ia menggunakan Stream.toArray untuk mengonversi elemen dalam aliran ke Array. Dalam pernyataan terakhir di atas "size -> new String [size]" sebenarnya adalah fungsi IntFunction yang mengalokasikan array String dengan ukuran stream String. Pernyataan itu identik dengan
sumber
Anda dapat mengonversi array Daftar ke String dengan menggunakan metode ini:
Contoh lengkap:
sumber
sumber