Panduan untuk Multimap Jambu Batu

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat salah satu implementasi Peta dari perpustakaan Google Guava - Multimap . Ini adalah koleksi yang memetakan kunci ke nilai, mirip dengan java.util.Map , tetapi di mana setiap kunci boleh dikaitkan dengan beberapa nilai.

2. Ketergantungan Maven

Pertama, mari tambah pergantungan:

 com.google.guava guava 29.0-jre 

Versi terbaru boleh didapati di sini.

3. Pelaksanaan Multimap

Sekiranya Guava Multimap, jika kita menambah dua nilai untuk kunci yang sama, nilai kedua tidak akan mengatasi nilai pertama. Sebaliknya, kita akan mempunyai dua nilai dalam peta yang dihasilkan . Mari lihat kes ujian:

String key = "a-key"; Multimap map = ArrayListMultimap.create(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(2, map.size()); 

Mencetak kandungan peta akan menghasilkan:

{a-key=[firstValue, secondValue]}

Apabila kita akan mendapat nilai dengan kunci "a-key" kita akan mendapat Koleksi yang berisi "firstValue" dan "secondValue" sebagai hasilnya:

Collection values = map.get(key);

Nilai percetakan akan dihasilkan:

[firstValue, secondValue]

4. Berbanding dengan Peta Piawai

Peta standard dari pakej java.util tidak memberi kita kemampuan untuk menetapkan beberapa nilai pada kunci yang sama. Mari pertimbangkan kes mudah apabila kita memasukkan () dua nilai ke dalam Peta menggunakan kunci yang sama:

String key = "a-key"; Map map = new LinkedHashMap(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(1, map.size()); 

Peta yang dihasilkan hanya mempunyai satu elemen ( “secondValue”), kerana operasi put () kedua yang mengatasi nilai pertama. Sekiranya kita ingin mencapai tingkah laku yang sama dengan Multimap Guava , kita perlu membuat Peta yang mempunyai Senarai sebagai jenis nilai:

String key = "a-key"; Map
    
      map = new LinkedHashMap(); List values = map.get(key); if(values == null) { values = new LinkedList(); values.add("firstValue"); values.add("secondValue"); } map.put(key, values); assertEquals(1, map.size());
    

Jelas sekali, sangat tidak senang digunakan. Dan sekiranya kita memerlukan keperluan dalam kod kita, Multimap Guava boleh menjadi pilihan yang lebih baik daripada java.util.Map.

Satu perkara yang perlu diperhatikan di sini ialah, walaupun kita mempunyai senarai yang memiliki dua elemen di dalamnya, kaedah size () mengembalikan 1. Dalam Multimap, size () mengembalikan sejumlah nilai sebenarnya yang disimpan dalam Peta, tetapi keySet (). Size () mengembalikan bilangan kekunci yang berbeza.

5. Kelebihan Multimap

Multimaps biasanya digunakan di tempat di mana Peta sebaliknya akan muncul. Perbezaannya merangkumi:

  • Tidak perlu mengisi koleksi kosong sebelum menambahkan entri dengan put ()
  • Kaedah get () tidak pernah mengembalikan nol , hanya koleksi kosong (kita tidak perlu menyemak null seperti di Peta kes ujian)
  • Kunci terdapat dalam Multimap jika dan hanya jika ia memetakan sekurang-kurangnya satu nilai. Sebarang operasi yang menyebabkan kunci mempunyai nilai yang berkaitan dengan sifar, mempunyai kesan mengeluarkan kunci itu dari Peta Multim (dalam Peta , walaupun kita membuang semua nilai dari koleksi, kita tetap menyimpan Koleksi kosong sebagai nilai, dan ini adalah memori yang tidak perlu di overhead)
  • Jumlah nilai kemasukan tersedia sebagai ukuran ()

6. Kesimpulannya

Artikel ini menunjukkan bagaimana dan kapan menggunakan Guava Multimap. Ia membandingkannya dengan java.util.Map standard dan menunjukkan kebaikan Guava Multimap.

Semua contoh dan coretan kod ini boleh didapati di projek GitHub - ini adalah projek Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.