Saya memiliki daftar integer, List<Integer>
dan saya ingin mengubah semua objek integer menjadi Strings, sehingga menyelesaikannya dengan yang baru List<String>
.
Secara alami, saya dapat membuat yang baru List<String>
dan melalui daftar yang memanggil String.valueOf()
setiap bilangan bulat, tetapi saya bertanya-tanya apakah ada cara yang lebih baik (baca: lebih otomatis ) untuk melakukannya?
java
string
collections
integer
ChrisThomas123
sumber
sumber
Dengan menggunakan Koleksi Google dari Guava-Project , Anda dapat menggunakan
transform
metode di kelas DaftarYang
List
dikembalikan olehtransform
adalah tampilan di daftar cadangan - transformasi akan diterapkan pada setiap akses ke daftar yang diubah.Sadarilah bahwa
Functions.toStringFunction()
akan melemparNullPointerException
ketika diterapkan ke null, jadi gunakan hanya jika Anda yakin daftar Anda tidak akan berisi null.sumber
Solusi untuk Java 8. Sedikit lebih lama daripada Guava, tetapi setidaknya Anda tidak perlu menginstal perpustakaan.
sumber
toString
contoh, ini akhirnya menjadi lebih pendek untuk konversi yang tidak didukung oleh pustaka Fungsi Guava. Fungsi Kustom masih mudah, tetapi secara signifikan lebih banyak kode daripada aliran Java 8 iniApa yang Anda lakukan baik-baik saja, tetapi jika Anda merasa perlu 'Java-it-up' Anda dapat menggunakan Transformer dan metode kumpulkan dari Apache Commons , misalnya:
..lalu..
sumber
Sumber untuk String.valueOf menunjukkan ini:
Bukan berarti itu terlalu penting, tapi saya akan menggunakan toString.
sumber
Alih-alih menggunakan String.valueOf, saya akan menggunakan .toString (); ini menghindari beberapa tinju otomatis yang dijelaskan oleh @ johnathan.holland
Javadoc mengatakan bahwa valueOf mengembalikan hal yang sama seperti Integer.toString ().
sumber
Berikut adalah solusi satu baris tanpa mencontek dengan pustaka non-JDK.
sumber
Solusi lain menggunakan Jambu Biji dan Java 8
sumber
Bukan inti Java, dan bukan generik-ified, tetapi perpustakaan koleksi Jakarta commons yang populer memiliki beberapa abstraksi yang berguna untuk tugas semacam ini. Secara khusus, lihat metode pengumpulan di
CollectionUtils
Sesuatu yang perlu dipertimbangkan jika Anda sudah menggunakan koleksi milik bersama dalam proyek Anda.
sumber
Untuk orang-orang yang peduli tentang "tinju", jawaban jsight: tidak ada.
String.valueOf(Object)
digunakan di sini, dan tidak boleh membuka kotakint
tidak pernah dilakukan.Apakah Anda menggunakan
Integer.toString()
atauString.valueOf(Object)
bergantung pada bagaimana Anda ingin menangani kemungkinan nulls. Apakah Anda ingin membuat pengecualian (mungkin), atau memiliki String "null" dalam daftar Anda (mungkin). Jika yang pertama, apakah Anda ingin melemparNullPointerException
atau jenis lainnya?Juga, satu kelemahan kecil dalam respon jsight:
List
adalah sebuah antarmuka, Anda tidak dapat menggunakan operator baru di dalamnya. Saya mungkin akan menggunakan ajava.util.ArrayList
dalam kasus ini, terutama karena kita tahu di depan berapa panjang daftar itu.sumber
sumber
@ Jonathan: Saya bisa saja salah, tapi saya yakin bahwa String.valueOf () dalam hal ini akan memanggil fungsi String.valueOf (Object) daripada dimasukkan ke dalam kotak ke String.valueOf (int). String.valueOf (Object) hanya mengembalikan "null" jika null atau memanggil Object.toString () jika bukan null, yang seharusnya tidak melibatkan tinju (meskipun jelas membuat instance objek string baru terlibat).
sumber
Saya pikir menggunakan Object.toString () untuk tujuan apa pun selain debugging mungkin adalah ide yang sangat buruk, meskipun dalam hal ini keduanya secara fungsional setara (dengan asumsi daftar tidak memiliki nulls). Pengembang bebas mengubah perilaku metode toString () apa pun tanpa peringatan apa pun, termasuk metode toString () kelas apa pun di pustaka standar.
Jangan khawatir tentang masalah kinerja yang disebabkan oleh proses tinju / unboxing. Jika kinerja sangat penting, gunakan saja larik. Jika sangat penting, jangan gunakan Java. Mencoba mengakali JVM hanya akan menyebabkan sakit hati.
sumber
Jawaban hanya untuk para ahli:
sumber
String
) akan berbagi larik dukungan yang sama (dariall
), jadi sebenarnya akan sangat efisien dalam memori, yang akan menjadi penting untuk kinerja jangka panjang. Kecuali jika Anda hanya ingin menyimpan salah satu elemen saja ...Lambdaj memungkinkan untuk melakukan itu dengan cara yang sangat sederhana dan mudah dibaca. Sebagai contoh, misalkan Anda memiliki daftar Integer dan Anda ingin mengubahnya dalam representasi String yang sesuai, Anda dapat menulis sesuatu seperti itu;
Lambdaj menerapkan fungsi konversi hanya saat Anda mengulangi hasilnya.
sumber
Anda tidak bisa menghindari "overhead tinju"; Container faux generic Java hanya dapat menyimpan Object, jadi int Anda harus dimasukkan ke dalam kotak Integer. Pada prinsipnya itu bisa menghindari downcast dari Object ke Integer (karena tidak ada gunanya, karena Object cukup baik untuk String.valueOf dan Object.toString) tetapi saya tidak tahu apakah compiler cukup pintar untuk melakukan itu. Konversi dari String ke Object harus kurang lebih tidak ada operasi, jadi saya akan enggan untuk khawatir tentang itu.
sumber
Kita bisa menggunakan iterator untuk mencapai hal yang sama.
sumber
Menggunakan Streams: Jika katakanlah hasilnya adalah daftar integers (
List<Integer> result
) maka:Salah satu cara untuk mengatasinya. Semoga ini membantu.
sumber
Solusi yang sedikit lebih ringkas menggunakan metode forEach di daftar asli:
sumber
Hanya untuk bersenang-senang, solusi menggunakan kerangka kerja jsr166y fork-join yang seharusnya ada di JDK7.
(Penafian: Tidak dikompilasi. Spesifikasi belum diselesaikan. Dll)
Tidak mungkin berada di JDK7 adalah sedikit jenis inferensi dan gula sintaksis untuk membuatnya dengan Pemetaan panggilan kurang verbose:
sumber
Ini adalah hal mendasar yang harus dilakukan, saya tidak akan menggunakan pustaka eksternal (ini akan menyebabkan ketergantungan dalam proyek Anda yang mungkin tidak Anda perlukan).
Kami memiliki kelas metode statis yang dibuat khusus untuk melakukan pekerjaan semacam ini. Karena kode untuk ini sangat sederhana, kami membiarkan Hotspot melakukan optimasi untuk kami. Ini tampaknya menjadi tema dalam kode saya baru-baru ini: tulis kode yang sangat sederhana (langsung) dan biarkan Hotspot melakukan keajaibannya. Kami jarang memiliki masalah kinerja di sekitar kode seperti ini - ketika versi VM baru hadir, Anda mendapatkan semua manfaat kecepatan ekstra, dll.
Meski saya suka koleksi Jakarta, mereka tidak mendukung Generik dan menggunakan 1.4 sebagai LCD. Saya waspada terhadap Koleksi Google karena mereka terdaftar sebagai tingkat dukungan Alfa!
sumber
Saya hanya ingin berpadu dengan solusi berorientasi objek untuk masalah ini.
Jika Anda memodelkan objek domain, maka solusinya ada di objek domain. Domain di sini adalah Daftar bilangan bulat yang kita ingin nilai stringnya.
Cara termudah adalah dengan tidak mengubah daftar sama sekali.
Karena itu, untuk mengonversi tanpa mengonversi, ubah daftar asli Integer ke Daftar Nilai, di mana Nilai terlihat seperti ini ...
Ini akan lebih cepat dan memakan lebih sedikit memori daripada menyalin Daftar.
Semoga berhasil!
sumber