Panduan untuk Guava Multimap

1. Ikhtisar

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

2. Ketergantungan Maven

Pertama, mari tambahkan dependensi:

 com.google.guava guava 29.0-jre 

Versi terbaru dapat ditemukan di sini.

3. Implementasi Multimap

Dalam kasus Guava Multimap, jika kita menambahkan dua nilai untuk kunci yang sama, nilai kedua tidak akan menimpa nilai pertama. Sebagai gantinya, kita akan memiliki dua nilai di peta yang dihasilkan . Mari kita lihat kasus uji:

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

Mencetak konten peta akan menghasilkan:

{a-key=[firstValue, secondValue]}

Saat kita mendapatkan nilai dengan kunci "a-key" kita akan mendapatkan Koleksi yang berisi "firstValue" dan "secondValue" sebagai hasil:

Collection values = map.get(key);

Nilai pencetakan akan menghasilkan:

[firstValue, secondValue]

4. Dibandingkan dengan Peta Standar

Peta standar dari paket java.util tidak memberi kita kemampuan untuk menetapkan beberapa nilai ke kunci yang sama. Mari pertimbangkan kasus sederhana ketika kita meletakkan () dua nilai ke dalam Map 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 memiliki satu elemen ( "secondValue"), karena operasi put () kedua yang menimpa nilai pertama. Jika kita ingin mencapai perilaku yang sama seperti pada Multimap Guava , kita perlu membuat Peta yang memiliki Daftar sebagai tipe 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, ini sangat tidak nyaman digunakan. Dan jika kita memiliki kebutuhan seperti itu dalam kode kita maka Multimap Guava bisa menjadi pilihan yang lebih baik daripada java.util.Map.

Satu hal yang perlu diperhatikan di sini adalah, meskipun kita memiliki daftar yang memiliki dua elemen di dalamnya, metode size () mengembalikan 1. Dalam Multimap, size () mengembalikan jumlah nilai aktual yang disimpan dalam Peta, tetapi keySet (). Size () mengembalikan jumlah kunci berbeda.

5. Kelebihan Multimap

Multimaps biasanya digunakan di tempat-tempat di mana Peta jika tidak akan muncul. Perbedaannya antara lain:

  • Tidak perlu mengisi koleksi kosong sebelum menambahkan entri dengan put ()
  • Metode get () tidak pernah mengembalikan null , hanya koleksi kosong (kita tidak perlu memeriksa null seperti di Map Kasus cobaan)
  • Kunci terdapat dalam Multimap jika dan hanya jika memetakan ke setidaknya satu nilai. Operasi apa pun yang menyebabkan kunci memiliki nilai terkait nol, memiliki efek menghapus kunci tersebut dari Multimap (di Peta , bahkan jika kita menghapus semua nilai dari koleksi, kita masih menyimpan Koleksi kosong sebagai nilai, dan ini adalah pengeluaran memori yang tidak perlu)
  • Jumlah total nilai entri tersedia sebagai size ()

6. Kesimpulan

Artikel ini menunjukkan bagaimana dan kapan menggunakan Guava Multimap. Ini membandingkannya dengan java.util.Map standar dan menunjukkan kelebihan Guava Multimap.

Semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub - ini adalah proyek Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.