Saya mencoba untuk mengkonversi ArrayList yang berisi objek Integer ke primitif int [] dengan potongan kode berikut, tetapi ia melemparkan kesalahan waktu kompilasi. Apakah mungkin mengkonversi di Jawa?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
sumber
sumber
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Jawaban:
Anda dapat mengonversi, tetapi saya rasa tidak ada yang dibangun untuk melakukannya secara otomatis:
(Perhatikan bahwa ini akan melempar NullPointerException jika salah satu
integers
atau elemen di dalamnyanull
.)Sunting: Sesuai komentar, Anda mungkin ingin menggunakan daftar iterator untuk menghindari biaya buruk dengan daftar seperti
LinkedList
:sumber
integers.stream().mapToInt(Integer::valueOf).toArray
Jika Anda menggunakan java-8 ada juga cara lain untuk melakukan ini.
Apa yang dilakukannya adalah:
Stream<Integer>
dari daftarIntStream
dengan memetakan setiap elemen ke dirinya sendiri (fungsi identitas), menghapus kotakint
nilai yang disimpan oleh setiapInteger
objek (dilakukan secara otomatis sejak Java 5)int
dengan menelepontoArray
Anda juga dapat secara eksplisit menelepon
intValue
melalui referensi metode, yaitu:Perlu juga disebutkan bahwa Anda bisa mendapatkan
NullPointerException
jika Anda memilikinull
referensi dalam daftar. Ini bisa dengan mudah dihindari dengan menambahkan kondisi penyaringan ke pipa aliran seperti ini:Contoh:
sumber
double
tipe; apakah tidak ada yang setara untukfloat
jenis?Google Jambu
Google Guava menyediakan cara yang rapi untuk melakukan ini dengan menelepon
Ints.toArray
.sumber
Apache Commons memiliki kelas ArrayUtils, yang memiliki metode toPrimitive () yang melakukan hal ini.
Namun, seperti yang ditunjukkan Jon, cukup mudah untuk melakukannya sendiri daripada menggunakan perpustakaan eksternal.
sumber
Saya percaya iterasi menggunakan iterator Daftar adalah ide yang lebih baik, karena
list.get(i)
dapat memiliki kinerja yang buruk tergantung pada implementasi Daftar:sumber
menggunakan Dollar seharusnya cukup sederhana:
Saya berencana untuk meningkatkan DSL untuk menghapus
toArray()
panggilan menengahsumber
Ini berfungsi baik untuk saya :)
Ditemukan di https://www.techiedelight.com/convert-list-integer-array-int/
sumber
Ini membingungkan saya bahwa kami mendorong metode kustom satu kali setiap kali perpustakaan yang sangat baik, digunakan dengan baik seperti Apache Commons telah memecahkan masalah. Meskipun solusinya sepele jika tidak absurd, itu tidak bertanggung jawab untuk mendorong perilaku seperti itu karena pemeliharaan jangka panjang dan aksesibilitas.
Pergilah dengan Apache Commons
sumber
Jika Anda menggunakan Koleksi Eclipse , Anda bisa menggunakan
collectInt()
metode ini untuk beralih dari wadah objek ke wadah int primitif.Jika Anda dapat mengonversi
ArrayList
keFastList
, Anda dapat menyingkirkan adaptor.Catatan: Saya pengendara untuk koleksi Eclipse.
sumber
Java 8:
sumber
Arrays.setAll ()
Keluaran:
Karya-karya yang sama untuk berbagai
long
ataudouble
, tetapi tidak untuk arrayboolean
,char
,byte
,short
ataufloat
. Jika Anda memiliki daftar yang sangat besar, bahkan adaparallelSetAll
metode yang dapat Anda gunakan sebagai gantinya.Bagi saya ini bagus dan cukup elgant sehingga saya tidak ingin mendapatkan perpustakaan eksternal atau menggunakan stream untuk itu.
Tautan dokumentasi:
Arrays.setAll(int[], IntUnaryOperator)
sumber
Anda cukup menyalinnya ke sebuah array:
Tidak terlalu mewah; tapi, hei, itu berhasil ...
sumber
Solusi satu garis yang sangat sederhana adalah:
sumber
Segmen kode ini berfungsi untuk saya, coba ini:
Layak untuk menyebutkan ArrayList harus dinyatakan seperti ini:
sumber
sumber
akses
arr
seperti biasaint[]
.sumber