Baru-baru ini saya berbicara dengan seorang kolega tentang apa yang akan menjadi cara optimal untuk mengkonversi List
ke Map
Jawa dan jika ada manfaat khusus untuk melakukannya.
Saya ingin tahu pendekatan konversi yang optimal dan akan sangat menghargai jika ada yang bisa membimbing saya.
Apakah pendekatan yang baik ini:
List<Object[]> results;
Map<Integer, String> resultsMap = new HashMap<Integer, String>();
for (Object[] o : results) {
resultsMap.put((Integer) o[0], (String) o[1]);
}
Jawaban:
Dengan asumsi tentu saja setiap Item memiliki
getKey()
metode yang mengembalikan kunci dari jenis yang tepat.sumber
getKey()
parameter tertentu?getKey()
sewenang-wenang.Dengan java-8, Anda dapat melakukan ini dalam satu baris menggunakan aliran , dan
Collectors
kelas.Demo singkat:
Keluaran:
Seperti disebutkan dalam komentar, Anda dapat menggunakan
Function.identity()
alih-alihitem -> item
, meskipun saya menemukani -> i
agak eksplisit.Dan untuk menjadi catatan lengkap bahwa Anda dapat menggunakan operator biner jika fungsi Anda tidak bijective. Sebagai contoh mari kita pertimbangkan ini
List
dan fungsi pemetaan yang untuk nilai int, hitung hasilnya modulo 3:Saat menjalankan kode ini, Anda akan mendapatkan pesan kesalahan
java.lang.IllegalStateException: Duplicate key 1
. Ini karena 1% 3 sama dengan 4% 3 dan karenanya memiliki nilai kunci yang sama mengingat fungsi pemetaan kunci. Dalam hal ini Anda dapat menyediakan operator gabungan.Inilah salah satu yang menjumlahkan nilai-nilai;
(i1, i2) -> i1 + i2;
yang dapat diganti dengan referensi metodeInteger::sum
.yang sekarang menghasilkan:
Semoga ini bisa membantu! :)
sumber
Function.identity()
daripadaitem -> item
Function.identity()
kembalit -> t;
.::getKey
.Kalau-kalau pertanyaan ini tidak ditutup sebagai duplikat, jawaban yang tepat adalah menggunakan Google Collections :
sumber
Menggunakan Java 8 Anda dapat melakukan hal berikut:
Value
dapat berupa objek apa pun yang Anda gunakan.sumber
Sejak Java 8, jawaban oleh @ZouZou menggunakan
Collectors.toMap
kolektor tentu cara idiomatis untuk menyelesaikan masalah ini.Dan karena ini adalah tugas yang umum, kita dapat membuatnya menjadi utilitas statis.
Dengan begitu solusinya benar-benar menjadi satu garis.
Dan inilah cara Anda menggunakannya pada
List<Student>
:sumber
A
List
danMap
secara konseptual berbeda. AList
adalah koleksi barang yang dipesan. Item dapat berisi duplikat, dan item mungkin tidak memiliki konsep pengidentifikasi unik (kunci). Nilai AMap
telah dipetakan ke tombol. Setiap kunci hanya dapat menunjuk ke satu nilai.Oleh karena itu, tergantung pada
List
item Anda, mungkin atau tidak mungkin untuk mengubahnya menjadiMap
. ApakahList
barang Anda tidak memiliki duplikat? Apakah setiap item memiliki kunci unik? Jika demikian maka mungkin untuk menempatkannya diMap
.sumber
Alexis telah mengirim jawaban di Java 8 menggunakan metode
toMap(keyMapper, valueMapper)
. Sesuai dokumen untuk penerapan metode ini:Jadi jika kita tertarik pada implementasi spesifik dari
Map
antarmuka misalnyaHashMap
maka kita dapat menggunakan formulir kelebihan beban sebagai:Meskipun menggunakan salah satu
Function.identity()
atau baik -i->i
baik saja tetapi tampaknyaFunction.identity()
bukannyai -> i
menghemat beberapa memori sesuai jawaban terkait ini .sumber
Ada juga cara sederhana untuk melakukan ini menggunakan Maps.uniqueIndex (...) dari Googlejambu biji perpustakaan
sumber
Metode universal
sumber
converter
parameter dalam metode ini?Tanpa java-8, Anda dapat melakukan ini dalam satu koleksi baris Commons, dan kelas Penutupan
sumber
Banyak solusi muncul di pikiran, tergantung pada apa yang ingin Anda capai:
Setiap item Daftar adalah kunci dan nilai
Elemen daftar memiliki sesuatu untuk dicari, mungkin sebuah nama:
Elemen daftar memiliki sesuatu untuk dicari, dan tidak ada jaminan bahwa mereka unik: Gunakan MultiMaps Googles
Memberikan semua elemen posisi sebagai kunci:
...
Itu benar-benar tergantung pada apa yang ingin Anda capai.
Seperti yang dapat Anda lihat dari contoh, Peta adalah pemetaan dari kunci ke nilai, sementara daftar hanyalah serangkaian elemen yang masing-masing memiliki posisi. Jadi mereka tidak dapat secara otomatis dikonversi.
sumber
Inilah sedikit metode yang saya tulis untuk tujuan ini. Ini menggunakan Validasi dari Apache Commons.
Jangan ragu untuk menggunakannya.
sumber
Anda dapat memanfaatkan aliran stream Java 8.
Untuk detail lebih lanjut kunjungi: http://codecramp.com/java-8-streams-api-convert-list-map/
sumber
Contoh Java 8 untuk mengubah
List<?>
objek menjadiMap<k, v>
:Kode disalin dari:
https://www.mkyong.com/java8/java-8-convert-list-to-map/
sumber
seperti yang sudah dikatakan, di java-8 kami memiliki solusi ringkas oleh Kolektor:
dan juga, Anda dapat membuat sarang beberapa grup yang melewati metode pengelompokan lainnya sebagai parameter kedua:
Dengan cara ini, kita akan memiliki peta multi level, seperti ini:
Map<key, Map<key, List<Item>>>
sumber
Menggunakan aliran java-8
sumber
Saya suka jawaban Kango_V, tapi saya pikir itu terlalu rumit. Saya pikir ini lebih sederhana - mungkin terlalu sederhana. Jika cenderung, Anda dapat mengganti String dengan penanda Generik, dan membuatnya berfungsi untuk semua jenis Kunci.
Digunakan seperti ini:
sumber
Apache Commons MapUtils.populateMap
Jika Anda tidak menggunakan Java 8 dan Anda tidak ingin menggunakan loop eksplisit untuk beberapa alasan, coba
MapUtils.populateMap
dari Apache Commons.MapUtils.populateMap
Katakanlah Anda memiliki daftar
Pair
s.Dan Anda sekarang ingin Peta
Pair
kunci untukPair
objek.memberikan output:
Yang sedang berkata,
for
loop mungkin lebih mudah dipahami. (Ini di bawah ini memberikan output yang sama):sumber