Dart menyediakan tiga koleksi inti untuk mengelompokkan data, yaitu List untuk urutan berindeks, Set untuk kumpulan anggota yang unik, dan Map untuk pasangan kunci-nilai. Topik ini membahas literal ketiganya, metode dasar seperti add, remove, dan contains, serta versi const yang tidak dapat diubah. Setelah membacanya, pemilihan koleksi yang sesuai untuk suatu data dapat ditentukan dengan dasar yang jelas, bukan sekadar kebiasaan.
List: urutan yang dapat diindeks#
List menyimpan sekumpulan elemen dalam urutan tertentu, dan setiap elemen dapat diakses melalui indeks yang dimulai dari 0. Literal List ditulis dengan tanda kurung siku, misalnya ['beras', 'minyak', 'gula'], sedangkan anotasi tipe seperti <String>[...] mengunci jenis anggotanya sejak awal. Properti length menyatakan jumlah elemen, sedangkan isEmpty dan isNotEmpty menyatakan keadaan kosong atau berisi. Operasi yang sering digunakan meliputi add untuk menambah elemen di akhir, remove untuk menghapus berdasarkan nilai, dan contains untuk menguji keberadaan sebuah nilai.
Contoh berikut mengelola daftar belanja pribadi melalui operasi dasar tersebut, mulai dari pembacaan indeks hingga penghapusan elemen.
void main() {
var belanja = <String>['beras', 'minyak', 'gula'];
print(belanja[0]);
print(belanja.length);
belanja.add('kopi');
belanja.remove('minyak');
print(belanja);
print(belanja.contains('kopi'));
print(belanja.isEmpty);
print(belanja.isNotEmpty);
}beras
3
[beras, gula, kopi]
true
false
trueAkses belanja[0] mengembalikan beras karena indeks pertama List adalah 0, bukan 1. Keluaran menunjukkan bahwa add menyisipkan kopi di akhir, sedangkan remove menghapus minyak berdasarkan nilainya, bukan berdasarkan posisinya. Properti isEmpty bernilai false karena daftar berisi tiga elemen, dan isNotEmpty memberikan kebalikannya. Apabila indeks yang diminta berada di luar rentang, misalnya belanja[10] pada daftar tiga elemen, Dart melempar RangeError saat program berjalan.
Set: anggota yang unik#
Set menyimpan kumpulan anggota tanpa duplikat, sehingga nilai yang sama tetap hanya tersimpan satu kali meskipun disisipkan lebih dari sekali. Literal Set ditulis dengan tanda kurung kurawal, misalnya {'Ali', 'Budi', 'Citra'}, dan tipe anggotanya dapat dianotasi seperti pada List. Metode add mengembalikan bool yang menyatakan apakah anggota baru benar-benar ditambahkan, sedangkan contains dan remove bekerja berdasarkan nilai anggota. Sifat unik ini menjadikan Set pilihan yang tepat untuk kumpulan yang keanggotaannya bermakna, misalnya daftar hadir peserta atau kumpulan filter yang sedang aktif.
Contoh berikut mengelola daftar hadir sederhana dan menunjukkan perilaku keunikan anggota pada Set.
void main() {
var hadir = <String>{'Ali', 'Budi', 'Citra'};
print(hadir.length);
var ditambahkan = hadir.add('Budi');
print(ditambahkan);
print(hadir);
print(hadir.contains('Citra'));
hadir.remove('Ali');
print(hadir);
}3
false
{Ali, Budi, Citra}
true
{Budi, Citra}Pemanggilan add('Budi') mengembalikan false karena Budi sudah menjadi anggota, sehingga isi Set tidak bertambah dan length tetap tiga. Keluaran dicetak dengan tanda kurung kurawal, sedangkan urutannya mengikuti urutan penyisipan pada implementasi default Dart. Ciri kurung kurawal pada keluaran juga membedakan Set dari List yang dicetak dengan kurung siku, sehingga jenis koleksi yang dicetak langsung terlihat dari bentuknya.
Set juga dapat digunakan untuk membersihkan duplikat secara ringkas. Konversi List ke Set melalui toSet() membuang nilai ganda secara otomatis, dan hasilnya dapat dikembalikan menjadi List dengan toList(). Teknik ini berguna pada data yang terkumpul dari beberapa sumber, misalnya gabungan dua daftar hadir yang memuat nama yang sama.
Map: pasangan kunci dan nilai#
Map menyimpan pasangan kunci dan nilai, dengan ketentuan setiap kunci muncul satu kali dan menunjuk tepat pada satu nilai. Literal Map ditulis dengan tanda kurung kurawal beserta pasangan kunci: nilai, misalnya {'Senin': 'Ali'}, dan tipe kedua sisi dapat dianotasi seperti <String, String>. Pembacaan nilai dilakukan dengan operator indeks, yaitu piket['Senin'], sedangkan pengisian kunci yang belum ada sekaligus menambahkan pasangan baru ke dalam Map. Metode containsKey menguji keberadaan kunci, remove menghapus pasangan, sedangkan keys dan values menyediakan kumpulan kunci atau nilai secara terpisah.
Contoh berikut menyusun jadwal piket harian berupa pasangan hari dan nama petugas, lengkap dengan penambahan, penimpaan, dan penghapusan pasangan.
void main() {
var piket = <String, String>{
'Senin': 'Ali',
'Selasa': 'Budi',
};
print(piket['Senin']);
print(piket['Rabu']);
piket['Rabu'] = 'Citra';
piket['Senin'] = 'Dewi';
print(piket);
print(piket.length);
print(piket.containsKey('Kamis'));
piket.remove('Selasa');
print(piket.keys.toList());
print(piket.values.toList());
}Ali
null
{Senin: Dewi, Selasa: Budi, Rabu: Citra}
3
false
[Senin, Rabu]
[Dewi, Citra]Membaca kunci yang belum ada tidak melempar error, tetapi mengembalikan null karena operator [] pada Map dideklarasikan mengembalikan V?, yaitu tipe nilai yang boleh kosong. Pola ini menuntut kode yang membaca Map agar siap menghadapi null, misalnya melalui operator ?? untuk menyediakan nilai bawaan. Pengisian piket['Rabu'] = 'Citra' menambahkan pasangan baru, sedangkan piket['Senin'] = 'Dewi' menimpa nilai lama karena kuncinya sudah ada. Baris terakhir menghapus Selasa, sehingga keys dan values masing-masing mencetak dua anggota yang tersisa.
const: koleksi yang tidak dapat diubah#
Literal koleksi secara default menghasilkan koleksi mutable, yaitu koleksi yang isinya boleh berubah setelah dibuat. Kata kunci const mengubah perilaku tersebut sehingga koleksi menjadi tidak dapat diubah (unmodifiable) secara menyeluruh, termasuk koleksi yang berada di dalamnya. Penulisannya ada dua bentuk, yaitu const pada deklarasi variabel seperti const hari = [...] dan const pada literal seperti var hari = const [...]. Pada kedua bentuk tersebut, percobaan add, remove, atau pengisian indeks melempar UnsupportedError saat program berjalan.
Contoh berikut membuat List melalui literal const, mencoba menambahkan satu elemen, lalu menangkap error tersebut agar program tetap berjalan.
void main() {
var hariEfektif = const ['Senin', 'Selasa', 'Rabu'];
print(hariEfektif.length);
try {
hariEfektif.add('Kamis');
} catch (e) {
print(e.runtimeType);
print(e);
}
}3
UnsupportedError
Unsupported operation: Cannot add to an unmodifiable listPesan error menyatakan permasalahannya secara langsung, yaitu daftar yang tidak dapat diubah tidak menerima anggota baru. Tipe deklarasi hariEfektif tetap List<String>, sehingga analyzer tidak menolak pemanggilan add tersebut sejak awal. Penolakan baru terjadi saat program berjalan, sehingga jenis kegagalan semacam ini tidak terlihat oleh dart analyze.
Perbedaan const dengan final juga perlu dipahami, karena final hanya mengunci variabelnya agar tidak diisi ulang, sedangkan isi koleksinya tetap boleh berubah. Sebuah List final masih menerima add, sedangkan List const menolaknya. Aturan praktisnya sederhana, yaitu gunakan const bila isinya sudah diketahui saat kompilasi dan tidak akan pernah berubah, lalu gunakan final atau var untuk sisanya.
Ringkasan#
Listmenyimpan elemen berurutan yang diakses melalui indeks 0, denganadd,remove,contains,length, danisEmptysebagai operasi dasarnya.Setmenyimpan anggota unik,addmengembalikanbool, dan urutan penyisipan dijaga olehLinkedHashSettanpa menjadi kontrak antarmukanya.Mapmenyimpan pasangan kunci-nilai, operator[]mengembalikannulluntuk kunci yang tidak ada, dan pengisian kunci lama menimpa nilai.constmembuat koleksi tidak dapat diubah dan percobaan modifikasinya melemparUnsupportedError, sedangkanfinalhanya mengunci variabelnya.
Referensi#
- Collections — dart.dev
— Dokumentasi resmi literal List, Set, dan Map beserta versi
const-nya. - Kelas List — api.dart.dev
— Referensi API metode
add,remove,contains, danlengthpada List. - Kelas Set — api.dart.dev
— Referensi API keunikan anggota Set beserta metode
add,remove, dancontains. - Kelas Map — api.dart.dev
— Referensi API pasangan kunci-nilai, termasuk deklarasi
[]yang mengembalikanV?.