Kenapa perlu membuat sebuah Map ?


Struktur Data Map merupakan struktur data umum yang cukup favorit.

Dengan konsep Key dan Value, maka representasi dari data menjadi cukup lengkap.

Adanya Key membuat kita tahu mengenai ini tentang apa nya , dan bukan hanya tentang Nilai nya saja.


Penggunaan Map


Struktur data Map berguna untuk pencarian, update, ataupun delete data yang berbasiskan key.

Misalnya :

  • Pencarian data di sebuah file .json berdasarkan key.
  • Pencarian, update, delete data ke database menggunakan Hibernate persistent context yang berbasiskan key.
  • Melakukan konfigurasi aplikasi berdasarkan file .yml dengan menggunakan key.
  • Pencarian data di basis data No SQL berbasiskan key value.
  • dll.

Pada kenyataannya, hampir semua teknologi di Software Engineering memanfaatkan struktur data ini sebagai struktur data favoritnya.

Termasuk didalamnya juga untuk hal-hal sederhana, seperti :

  • Inisiasi data untuk testing.
  • Bikin data constant dalam coding program.
  • Pemetaan data secara sederhana.
  • dll

Inisiasi Map sederhana


Kalau kita lihat, untuk hal-hal sederhana seperti diatas, biasa nya kita membutuhkan cara yang Cepat dan Mudah dalam menginisiasi Map.

Maka ada beberapa cara tersebut, sbb :



1. Pakai Double brace initialization


1Map<String, String> userMap  = new HashMap<String, String>() {{
2    put("budi", "Budi 1");
3    put("badu", "Badu 2");
4}};
5
6String user1 = userMap.get("budi");
7String user2 = userMap.get("badu");

walaupun cara ini mudah, tapi menyisakan kasus anynomous class setip kali ada instance nya dibikin.

Seperti yang dijelaskan di Double Brace Initialization

Tetapi sebenarnya tidak terlalu bermasalah, apalagi misalnya di framework Spring yang Singleton.



2. Pakai Static block dan Static variable


1public static Map<String, String> userMap  = new HashMap<String, String>();
2
3static {
4    userMap.put("budi", "Budi 1");
5    userMap.put("badu", "Badu 2");
6}
7
8String user1 = userMap.get("budi");
9String user2 = userMap.get("badu");

Dengan Static ini, maka variable userMap diatas, merupakan milik Class, bukan lagi milik object/instance.

Oleh karenanya, harus hati-hati kalau misalnya variabl userMap diatas bisa dimodifikasi oleh instance/object yang berbeda.



3. Pakai fungsi Java Collection

Cara ini berlaku untuk kalau kita hanya butuh satu inputan Key/Value.


1import java.util.Collections;
2
3public Map<String, String> userMap  = Collections.singletonMap("budi", "Budi 1");
4
5String user1 = userMap.get("budi");

Dan hasilnya adalah Immutable, yaitu kita tidak bisa mengupdate datanya setelah kita buat.

Kalau kita melakukan modifikasi terhadap map diatas, maka akan mengembalikan error :

java.lang.UnsupportedOperationException



4. Pakai fungsi Java 8 Stream Collection , dengan memanfaatkan Array[][] (2 dimensi array)

Semenjak Java 8 , kita akan menemui konsep stream.

Dan konsep ini juga dipakai untuk pemrosesan Map sebagai salah satu bagian dari Java Collection Framework.


 1import java.util.stream.Collectors;
 2import java.util.stream.Stream;
 3
 4Map<String, String> userMap = Stream.of(new String[][] {
 5  { "budi", "Budi 1" },
 6  { "badu", "Badu 2" }, })
 7.collect(Collectors.toMap(user -> user[0], user -> user[1]));
 8
 9String user1 = userMap.get("budi");
10String user2 = userMap.get("badu");

Dalam kasus diatas, kita menggunakan fungsi Stream.collect() yang merupakan salah satu fungsi/method terminal di Java 8’s Stream API‘s.

Method Terminal disini maksudnya sebagai method yang menghasilkan Non Stream, yang menghasilkan hasil yang konkrit, seperti Collection lagi, atau nilai primitive, atau tidak ada hasil sama sekali.

Parameternya berupa fungsi Collectors, dan salah satunya adalah Collectors.toMap.

Secara penamaan, bisa kita lihat, bahwa fungsi ini akan membuat hasil dalam bentuk Map dari stream sebelumnya.



5. Pakai fungsi Java 8 Stream Collection , dengan memanfaatkan AbstractMap.SimpleEntry


1import java.util.AbstractMap;
2
3Map<String, String> userMap = Stream
4    .of(new AbstractMap.SimpleEntry<>("budi", "Budi 1"), new AbstractMap.SimpleEntry<>("badu", "Badu 2"))
5    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
6
7String user1 = userMap.get("budi");
8String user2 = userMap.get("badu");

Cara yang ini mirip dengan sebelumnya, akan tetapi cuma berbeda dari sisi inisiasi struktur data awalnya.

Cara yang ini dari awal sudah membuat struktur data dalam bentuk abstraksi Map dengan memakai class AbstractMap.



6. Pakai fungsi Map.of (sejak Java 9)


Semenjak Java 9 juga, Map juga mempunyai factory method , Map.of.

Parameternya berupa urutan Key Value secara berurutan, sebanyak yang kita mau tetapi dibatasi maksimal hanya 10 jumlah entries nya.


1import java.util.Map;
2
3Map<String, String> userMap = Map.of("budi", "Budi 1", "badu", "Badu 2");
4
5String user1 = userMap.get("budi");
6String user2 = userMap.get("badu");


7. Pakai fungsi Map.ofEntries (sejak Java 9)


Semenjak Java 9 juga, Map juga mempunyai factory method , Map.ofEntries.

Parameternya berupa urutan Key Value secara berurutan, sebanyak yang kita mau dan tidak dibatasi jumlah entries nya.


1import java.util.Map;
2
3Map<String, String> ofEntries = Map.ofEntries(Map.entry("budi", "Budi 1"), Map.entry("badu", "Badu 2"));
4
5String user1 = userMap.get("budi");
6String user2 = userMap.get("badu");

Demikianlah beberapa cara untuk menginisiasi Map dalam bahasa Java.