List, Set & Map
Tiga collection utama Dart: List (berurutan), Set (unik), Map (kunci-nilai); operasi dasar, spread, collection if/for, serta map/where/reduce.
Mengapa collection?
Kita jarang mengolah satu nilai saja. Daftar nama, kumpulan harga, data pengguna: semuanya butuh wadah. Dart punya tiga collection utama.
| Collection | Sifat | Contoh |
|---|---|---|
List | Berurutan, boleh duplikat, diakses dengan indeks | [1, 2, 2, 3] |
Set | Tanpa duplikat, tanpa indeks | {1, 2, 3} |
Map | Pasangan kunci → nilai | {'a': 1, 'b': 2} |
List
List<String> buah = ['apel', 'jeruk', 'mangga'];
var angka = <int>[]; // List kosong bertipe int
buah[0]; // 'apel'
buah.length; // 3
buah.first; buah.last; // 'apel', 'mangga'
buah.add('pisang'); // tambah di akhir
buah.addAll(['kiwi', 'anggur']);
buah.insert(0, 'melon'); // sisip di indeks 0
buah.remove('jeruk'); // hapus berdasarkan nilai
buah.removeAt(0); // hapus berdasarkan indeks
buah.contains('apel'); // true
buah.indexOf('mangga'); // posisi, atau -1
buah.sort(); // urutkan di tempat
buah.reversed.toList(); // balik urutan
Akses indeks di luar rentang melempar RangeError. List yang dibuat dengan const [..] atau List.unmodifiable tidak bisa diubah.
Set: nilai unik
var tag = {'dart', 'flutter', 'dart'}; // hanya satu 'dart'
tag.add('web');
tag.contains('dart'); // true
print(tag.length); // 3
var a = {1, 2, 3};
var b = {3, 4};
a.union(b); // {1, 2, 3, 4}
a.intersection(b); // {3}
a.difference(b); // {1, 2}
[1, 2, 2, 3, 3].toSet().toList(); // [1, 2, 3] (hapus duplikat)
Hati-hati: var x = {}; adalah Map kosong, bukan Set. Untuk Set kosong tulis <String>{}.
Map
Map<String, int> stok = {'apel': 5, 'jeruk': 8};
stok['apel']; // 5
stok['durian']; // null (tidak ada), tipe hasil: int?
stok['pisang'] = 12; // tambah / ubah
stok.remove('jeruk');
stok.containsKey('apel'); // true
stok.keys; stok.values; // kumpulan kunci / nilai
stok['apel'] = (stok['apel'] ?? 0) + 1;
stok.putIfAbsent('kiwi', () => 3);
for (var e in stok.entries) {
print('${e.key}: ${e.value}');
}
Spread dan collection if / for
Dart punya sintaks khusus untuk membangun collection secara deklaratif (sering muncul di Flutter):
var a = [1, 2];
var b = [...a, 3, 4]; // [1, 2, 3, 4] (spread)
bool admin = true;
var menu = ['Beranda', if (admin) 'Pengaturan', 'Keluar'];
var kuadrat = [for (var i = 1; i <= 4; i++) i * i]; // [1, 4, 9, 16]
Mengolah data dengan map, where, reduce
var angka = [1, 2, 3, 4, 5, 6];
angka.where((n) => n.isEven).toList(); // [2, 4, 6] saring
angka.map((n) => n * n).toList(); // [1, 4, 9, ...] ubah tiap elemen
angka.reduce((a, b) => a + b); // 21 gabung jadi satu
angka.fold(0, (jumlah, n) => jumlah + n); // 21 (dengan nilai awal)
angka.any((n) => n > 5); // true (ada yang memenuhi)
angka.every((n) => n > 0); // true (semua memenuhi)
angka.firstWhere((n) => n > 3); // 4
angka.take(3).toList(); // [1, 2, 3]
angka.skip(4).toList(); // [5, 6]
map dan where menghasilkan Iterable yang malas; tambahkan .toList() bila butuh List.
Mengurutkan dengan aturan sendiri
var nama = ['Budi', 'Al', 'Cintya'];
nama.sort((a, b) => a.length.compareTo(b.length)); // berdasar panjang
// ['Al', 'Budi', 'Cintya']
Memilih collection
| Kebutuhan | Pilih |
|---|---|
| Daftar berurutan | List |
| Memastikan tidak ada duplikat / cek keanggotaan cepat | Set |
| Mencari nilai lewat kunci | Map |
Error umum
RangeError (index): Invalid value: Not in inclusive range 0..2→ indeks salah.Unsupported operation: Cannot add to an unmodifiable list→ mengubah listconst/unmodifiable.A value of type 'int?' can't be assigned to 'int'→ hasilmap[kunci]bisa null; beri nilai cadangan dengan??.