Masukkan Password
40 4.2 Map in Dart Programming Language | Map in More Details | Learn Dart Language | Dart Course
Pada materi ini kita membahas Map di Dart. Kalau pada List kita menyimpan banyak data berdasarkan posisi/index, maka pada Map kita menyimpan data berdasarkan pasangan key dan value.
Ada beberapa bagian penting di materi ini, jadi saya jelaskan dari dasar sampai looping supaya konsepnya benar-benar jelas.
1. Apa itu Map?
Bayangkan kamu punya buku kontak:
| Nama | Kota |
|---|---|
| Budi | Madiun |
| Andi | Jakarta |
Di sini:
NamadanKotabisa dianggap sebagai keyBudi,Madiun,Andi,Jakartaadalah value
Jadi secara sederhana:
Map = kumpulan data dalam bentuk
key → value.
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun"
};
Bentuknya bisa dibayangkan seperti:
"name" → "Budi"
"city" → "Madiun"
Berbeda dengan List:
List<String> names = ["Budi", "Andi"];
Pada List, kita mengambil data berdasarkan index:
names[0]
Sedangkan pada Map, kita mengambil data berdasarkan key:
data["name"]
2. Struktur dasar Map
Bentuk umum:
Map<TipeKey, TipeValue> namaMap = {
key1: value1,
key2: value2,
};
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Perhatikan:
Map<String, String>
Ada dua tipe data:
Map<tipe_key, tipe_value>
Jadi:
Map<String, String>
artinya:
Key harus
Stringdan value juga harusString.
3. Key harus unik
Ini salah satu karakteristik penting Map.
Setiap key harus unik.
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Kita punya dua key:
name
city
Tidak boleh kita mengharapkan dua entry terpisah dengan key "name" yang sama.
Kalau key yang sama digunakan lagi untuk memberikan value baru, yang terjadi adalah value sebelumnya diperbarui.
Contoh:
data["name"] = "Ali";
Sekarang:
name → Ali
city → Madiun
Bukan membuat name kedua.
Jadi ingat:
Key = identitas/pengenal data.
4. Cara membuat Map
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Kemudian:
print(data);
Hasilnya kurang lebih:
{name: Budi, city: Madiun}
Jadi kalau kita print Map secara langsung, seluruh pasangan key-value akan ditampilkan.
5. Mengambil satu value dari Map
Kalau kita hanya ingin mengambil name:
print(data["name"]);
Hasil:
Budi
Kalau ingin mengambil city:
print(data["city"]);
Hasil:
Madiun
Caranya:
namaMap[key]
Misalnya:
data["name"]
Artinya:
“Tolong ambil value yang mempunyai key
name.”
6. Bagaimana kalau key tidak ditemukan?
Misalnya:
print(data["xyz"]);
Padahal "xyz" tidak ada.
Hasilnya:
null
null secara sederhana berarti:
Tidak ada nilai / tidak ditemukan.
Jadi:
data["name"]
→ ada → "Budi"
Sedangkan:
data["xyz"]
→ tidak ada → null
Ini penting ketika bekerja dengan data dari pengguna, API, database, dan sebagainya.
7. Menambahkan data ke Map
Kita bisa menambahkan data baru seperti ini:
data["country"] = "Indonesia";
Misalnya sebelumnya:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Setelah:
data["country"] = "Indonesia";
menjadi:
name → Budi
city → Madiun
country → Indonesia
Jadi syntax-nya sama dengan mengambil value:
data["country"] = "Indonesia";
Bedanya:
data["country"]→ mengambildata["country"] = "Indonesia"→ memberikan/menambahkan value
8. Mengubah value yang sudah ada
Misalnya:
data["name"] = "Ali";
Kalau sebelumnya:
name → Budi
maka sekarang:
name → Ali
Tidak ada key baru.
Kita hanya mengganti value dari key "name".
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
data["name"] = "Ali";
print(data);
Hasil:
{name: Ali, city: Madiun}
Jadi bagaimana Dart membedakan tambah dan update?
Sangat sederhana:
Key belum ada
↓
Tambah data baru
Key sudah ada
↓
Update value
9. Masalah tipe data pada Map
Ini bagian yang sangat penting.
Misalnya kita membuat:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Ingat:
Map<String, String>
↑ ↑
key value
Artinya:
Key harus String
Value harus String
Maka ini boleh:
data["country"] = "Indonesia";
Tetapi ini tidak boleh:
data["age"] = 23;
Kenapa?
Karena:
"age" → String
23 → int
Sedangkan Map kita mengatakan:
Value harus String
10. Kalau value memiliki banyak tipe?
Misalnya kita ingin menyimpan:
name → Budi String
age → 23 int
height → 170.5 double
isAdmin → true bool
Kita tidak bisa menggunakan:
Map<String, String>
karena value-nya tidak semuanya String.
Kita bisa menggunakan dynamic:
Map<String, dynamic> data = {
"name": "Budi",
"age": 23,
"height": 170.5,
"isAdmin": true,
};
Sekarang value bisa mempunyai berbagai tipe.
"name" → "Budi" String
"age" → 23 int
"height" → 170.5 double
"isAdmin" → true bool
Kenapa sering digunakan?
Model data seperti ini sangat umum ketika menerima data JSON/API.
Contohnya:
Map<String, dynamic> user = {
"name": "Budi",
"age": 23,
"isOnline": true,
};
11. dynamic pada key
Bukan hanya value yang bisa menggunakan dynamic.
Key juga bisa.
Misalnya:
Map<dynamic, dynamic> data = {
"name": "Budi",
1: "Data satu",
true: "Data boolean",
};
Artinya key bisa memiliki berbagai tipe.
Tetapi dalam pemrograman nyata, sebaiknya jangan menggunakan dynamic kalau tidak diperlukan.
Lebih baik menggunakan tipe yang jelas.
Misalnya:
Map<String, dynamic>
biasanya lebih mudah dipahami daripada:
Map<dynamic, dynamic>
Karena kita masih tahu bahwa:
Key-nya pasti String, tetapi value-nya bisa bermacam-macam.
12. Key juga bisa berupa integer
Map tidak harus menggunakan String sebagai key.
Contoh:
Map<int, String> numbers = {
0: "value zero",
1: "value one",
2: "value two",
};
Sekarang:
0 → value zero
1 → value one
2 → value two
Untuk mengambil value:
print(numbers[0]);
Hasil:
value zero
Perhatikan:
numbers[0]
bukan:
numbers["0"]
Karena key kita adalah:
int
bukan:
String
13. Bedakan 0 dan "0"
Ini penting untuk pemula.
0
adalah integer.
Sedangkan:
"0"
adalah String.
Jadi:
Map<int, String> data = {
0: "Budi",
};
Ambil dengan:
data[0]
Benar.
Sedangkan:
data["0"]
salah untuk tipe Map<int, String>.
14. Mengambil semua value dengan .values
Misalnya:
Map<String, dynamic> data = {
"name": "Budi",
"age": 23,
"country": "Indonesia",
};
Kalau kita ingin mendapatkan semua value saja:
print(data.values);
Hasilnya kurang lebih:
(Budi, 23, Indonesia)
Jadi:
data.values
artinya:
Ambil semua value dari Map.
15. Mengubah .values menjadi List
.values menghasilkan sebuah Iterable, bukan List secara langsung.
Kalau kita ingin benar-benar menjadi List, gunakan:
data.values.toList()
Contoh:
List<dynamic> values = data.values.toList();
print(values);
Hasil:
[Budi, 23, Indonesia]
Konsepnya:
Map
↓
.values
↓
Iterable
↓
.toList()
↓
List
16. Mengambil semua key dengan .keys
Kalau:
data.values
untuk mengambil value,
maka:
data.keys
untuk mengambil key.
Contoh:
print(data.keys);
Hasil:
(name, age, country)
Kalau ingin menjadi List:
print(data.keys.toList());
Hasil:
[name, age, country]
17. .keys vs .values
Ini wajib diingat:
| Syntax | Artinya |
|---|---|
map.keys | semua key |
map.values | semua value |
map.entries | semua pasangan key-value |
Misalnya:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Maka:
data.keys
→ name, city
data.values
→ Budi, Madiun
data.entries
→ pasangan:
name → Budi
city → Madiun
18. Mengecek apakah key ada
Dart menyediakan:
containsKey()
Contoh:
print(data.containsKey("name"));
Kalau "name" ada:
true
Kalau:
print(data.containsKey("xyz"));
dan "xyz" tidak ada:
false
Jadi:
containsKey()
menghasilkan:
true / false
19. containsKey sangat berguna
Misalnya kita ingin mengambil data hanya kalau key-nya ada:
if (data.containsKey("name")) {
print(data["name"]);
}
Artinya:
“Kalau key
nametersedia, ambil valuenya.”
Ini berguna untuk mencegah asumsi bahwa suatu data pasti tersedia.
20. Mengecek apakah value ada
Selain:
containsKey()
ada:
containsValue()
Contoh:
print(data.containsValue("Budi"));
Kalau "Budi" ada sebagai value:
true
Kalau:
print(data.containsValue("Andi"));
dan "Andi" tidak ada:
false
Perbedaannya:
containsKey()
↓
mencari KEY
containsValue()
↓
mencari VALUE
21. Mengetahui jumlah data dengan .length
Sama seperti List, Map juga mempunyai:
.length
Contoh:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
"country": "Indonesia",
};
Maka:
print(data.length);
Hasil:
3
Karena ada 3 pasangan:
name
city
country
Yang dihitung adalah jumlah entry/pasangan key-value, bukan jumlah karakter atau jumlah key+value secara terpisah.
22. Mengecek apakah Map kosong
Gunakan:
data.isEmpty
Kalau kosong:
true
Kalau ada data:
false
Contoh:
print(data.isEmpty);
23. Mengecek apakah Map tidak kosong
Gunakan:
data.isNotEmpty
Kalau ada data:
true
Kalau kosong:
false
Jadi:
| Kondisi | isEmpty | isNotEmpty |
|---|---|---|
| Map kosong | true | false |
| Map ada data | false | true |
24. Menghapus seluruh Map dengan .clear()
Kalau:
data.clear();
semua entry dihapus.
Misalnya:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
};
Kemudian:
data.clear();
Map menjadi:
{}
Tetapi variabel data masih ada. Hanya isinya yang sudah dikosongkan.
25. Menghapus satu data dengan .remove()
Kalau ingin menghapus satu entry:
data.remove("name");
Perhatikan:
remove()menerima key, bukan value.
Misalnya:
Map<String, String> data = {
"name": "Budi",
"city": "Madiun",
"country": "Indonesia",
};
Kemudian:
data.remove("name");
Hasil:
{
city: Madiun,
country: Indonesia
}
Entry:
name → Budi
dihapus seluruhnya.
26. Kalau key-nya integer?
Misalnya:
Map<int, String> data = {
0: "zero",
1: "one",
2: "two",
};
Untuk menghapus key 0:
data.remove(0);
Bukan:
data.remove("0");
Karena key-nya int.
27. Menghapus berdasarkan kondisi dengan removeWhere
Ini salah satu fitur yang sangat berguna.
removeWhere()
digunakan untuk menghapus semua entry yang memenuhi kondisi tertentu.
Contoh:
Map<int, String> data = {
0: "value zero",
1: "value one",
2: "value two",
};
Misalnya kita ingin menghapus data dengan key 0:
data.removeWhere((key, value) {
return key == 0;
});
Maka key 0 dihapus.
28. Kenapa ada (key, value)?
Karena Map mempunyai dua bagian:
KEY → VALUE
Maka ketika melakukan:
removeWhere((key, value) {
...
});
Dart memberikan kita:
key
value
untuk setiap entry.
Kita bebas menggunakan salah satunya.
29. removeWhere berdasarkan key
Contoh:
data.removeWhere((key, value) {
return key == 0;
});
Artinya:
Hapus entry jika key-nya sama dengan
0.
30. removeWhere berdasarkan value
Kita juga bisa melihat value:
data.removeWhere((key, value) {
return value == "value one";
});
Artinya:
Hapus entry jika value-nya
"value one".
31. Menggunakan arrow function
Karena kondisinya sederhana, kita bisa menyingkat:
data.removeWhere((key, value) => value == "value one");
Ini sama dengan:
data.removeWhere((key, value) {
return value == "value one";
});
Jadi:
(key, value) => kondisi
adalah versi singkat dari function yang hanya mengembalikan satu expression.
32. Menghapus beberapa data sekaligus
Ini kelebihan removeWhere.
Misalnya:
data.removeWhere((key, value) {
return value == "value one" ||
value == "value two";
});
Artinya:
Hapus entry jika value adalah
"value one"ATAU"value two".
Operator:
||
berarti OR / atau.
33. Looping pada Map
Sekarang bagian yang cukup penting:
Bagaimana kalau kita ingin membaca semua data di dalam Map satu per satu?
Ada beberapa cara.
Yang dibahas dalam materi adalah:
for-inforEach()
34. Loop menggunakan map.entries
Misalnya:
Map<String, dynamic> data = {
"name": "Budi",
"age": 23,
"country": "Indonesia",
"city": "Madiun",
};
Kita bisa menggunakan:
for (var item in data.entries) {
print(item);
}
entries memberikan setiap pasangan:
key + value
35. Mengambil key dan value dari entry
Kita bisa menulis:
for (var item in data.entries) {
print(item.key);
print(item.value);
}
item.key:
mengambil key
item.value:
mengambil value
Misalnya output:
name
Budi
age
23
country
Indonesia
city
Madiun
36. Mencetak key dan value dalam satu baris
Kita bisa menggunakan string interpolation:
for (var item in data.entries) {
print("Key: ${item.key}, Value: ${item.value}");
}
Hasilnya kira-kira:
Key: name, Value: Budi
Key: age, Value: 23
Key: country, Value: Indonesia
Key: city, Value: Madiun
Ini sangat berguna ketika ingin menampilkan seluruh isi Map.
37. Loop menggunakan forEach()
Cara lainnya:
data.forEach((key, value) {
print("Key: $key, Value: $value");
});
Perhatikan bahwa forEach() pada Map memberikan langsung:
key
value
Jadi kita tidak perlu menggunakan:
item.key
item.value
karena key dan value sudah tersedia sebagai parameter.
38. Perbandingan entries dan forEach
Cara 1 — entries
for (var item in data.entries) {
print(item.key);
print(item.value);
}
Kita mendapatkan:
item
↓
key
value
Cara 2 — forEach
data.forEach((key, value) {
print(key);
print(value);
});
Kita langsung mendapatkan:
key
value
Untuk kebutuhan sederhana, forEach() sering terasa lebih ringkas.
39. Analogi sederhana Map
Bayangkan kamu punya lemari dengan laci.
Setiap laci punya label:
┌───────────────┐
│ name │ → Budi
├───────────────┤
│ age │ → 23
├───────────────┤
│ city │ → Madiun
├───────────────┤
│ country │ → Indonesia
└───────────────┘
Label laci = key
Isi laci = value
Kalau kamu bilang:
data["city"]
artinya:
“Buka laci yang labelnya
city.”
Kalau:
data["city"] = "Jakarta";
artinya:
“Ganti isi laci
citymenjadi Jakarta.”
Kalau:
data.remove("city");
artinya:
“Buang laci dengan label
city.”
Sedangkan:
data.keys
artinya:
“Berikan semua label laci.”
Dan:
data.values
artinya:
“Berikan semua isi laci.”
Analogi ini cukup bagus untuk mengingat konsep Map.
40. Perbedaan List dan Map
Ini sangat penting karena kamu sebelumnya sudah belajar List.
| List | Map |
|---|---|
| Data berdasarkan index | Data berdasarkan key |
Index mulai dari 0 | Key bisa String, int, dll |
list[0] | map["name"] |
| Urutan/index sangat penting | Key digunakan untuk identifikasi |
add() untuk menambah item | map[key] = value |
removeAt(index) | remove(key) |
Contoh List:
List<String> names = [
"Budi",
"Andi",
"Siti",
];
print(names[0]);
Hasil:
Budi
Karena Budi berada di index 0.
Sedangkan Map:
Map<String, String> users = {
"name": "Budi",
"city": "Madiun",
};
print(users["name"]);
Kita tidak peduli name berada di posisi ke berapa.
Kita mencari berdasarkan:
key = name
41. Map sangat cocok untuk data objek
Misalnya data seseorang:
Map<String, dynamic> user = {
"name": "Budi",
"age": 23,
"city": "Madiun",
"isStudent": true,
};
Kita bisa mengambil:
print(user["name"]);
Budi
atau:
print(user["age"]);
23
atau:
print(user["isStudent"]);
true
Inilah salah satu alasan Map sangat penting dalam pemrograman.
42. Contoh program lengkap
Coba perhatikan contoh berikut:
void main() {
Map<String, dynamic> user = {
"name": "Budi",
"age": 23,
"city": "Madiun",
"isStudent": true,
};
// Mengambil data
print(user["name"]);
// Menambahkan data
user["country"] = "Indonesia";
// Mengubah data
user["name"] = "Ali";
// Mengecek key
print(user.containsKey("age"));
// Mengecek value
print(user.containsValue("Madiun"));
// Jumlah data
print(user.length);
// Semua key
print(user.keys.toList());
// Semua value
print(user.values.toList());
// Loop
user.forEach((key, value) {
print("$key: $value");
});
}
Kamu bisa melihat bahwa satu Map bisa melakukan banyak hal:
MAP
│
┌───────────┼────────────┐
↓ ↓ ↓
Ambil Tambah Update
│ │ │
map[key] map[key] = x map[key] = x
│
├── keys
├── values
├── entries
├── containsKey()
├── containsValue()
├── length
├── isEmpty
├── isNotEmpty
├── clear()
├── remove()
├── removeWhere()
└── forEach()
43. Hal yang paling wajib kamu ingat
Kalau baru belajar Map, jangan mencoba menghafal semuanya sekaligus. Kuasai dulu konsep inti berikut:
1. Map menyimpan key → value
Map<String, String> data = {
"name": "Budi",
};
2. Mengambil value
data["name"]
3. Menambah atau mengubah
data["city"] = "Madiun";
4. Menghapus berdasarkan key
data.remove("city");
5. Mengecek key
data.containsKey("name");
6. Mengecek value
data.containsValue("Budi");
7. Semua key
data.keys
8. Semua value
data.values
9. Jumlah entry
data.length
10. Loop Map
data.forEach((key, value) {
print("$key: $value");
});
🔥 Inti terbesar dari materi ini
Kalau List bisa kamu bayangkan seperti rak yang memiliki nomor posisi:
index 0 → Budi
index 1 → Andi
index 2 → Siti
maka Map seperti lemari yang setiap lacinya memiliki label:
"name" → Budi
"age" → 23
"city" → Madiun
"country" → Indonesia
Jadi:
List mencari data berdasarkan index. Map mencari data berdasarkan key.
Dan satu pola syntax yang sangat penting adalah:
map[key]
untuk mengambil data, sedangkan:
map[key] = value;
untuk menambahkan atau memperbarui data.
Kalau konsep dua baris ini sudah benar-benar kamu pahami, sebagian besar dasar Map di Dart akan terasa jauh lebih mudah.