Koleksi di Dart

I. Tiga Jenis Koleksi Bawaan Dart

Dart menyediakan tiga tipe koleksi bawaan untuk pengelolaan data: List, Set dan Map;

Pembatasan tipe data elemen dalam koleksi diatur dengan menggunakanGenerik (Generics).

Tipe KoleksiKarakteristik UtamaSimbol Literal
ListTerurut, mengizinkan data duplikat, akses elemen melalui nomor indeks[]
SetTidak terurut, semua elemen unik, tidak memiliki indeks{} (generik wajib ditulis secara eksplisit agar dikenali sebagai Set)
MapMenyimpan pasangan kunci-nilai, kunci bersifat unik, nilai boleh sama antar pasangan{kunci: nilai}

II. List Daftar (Larangan Terurut)

1. Definisi Dasar dan Penentuan Tipe Otomatis

  • Semua larangan di Dart berupa objek tipe List, dibuat dengan simbol literal [];
  • Tipe data akan ditentukan secara otomatis. Contoh: var list = [1,2,3]List<int>; jika memasukkan data tipe lain akan muncul galat;
  • Mendukungkoma di akhir daftar, tidak merusak sintaks kode dan mengurangi kesalahan saat salin-tempel: var list = ['Car', 'Boat', 'Plane',];

2. Operasi Dasar List

  1. Aturan Indeks: Penomoran dimulai dari angka 0, indeks terakhir yang valid adalah list.length - 1;
  2. Membaca / mengubah elemen: list[index], list[index] = nilaiBaru;
  3. Mendapatkan jumlah elemen: properti .length;

Contoh Kode

void main() {
	var list = [1,2,3];
	print(list.length);//Menampilkan total elemen: 3
	print(list[1]);// Menampilkan angka 2
	list[1] = 9; //Mengganti elemen kedua menjadi 9
	print(list[1]);//Menampilkan nilai yang sudah diubah: 9
}

3. List Konstan (Tidak Bisa Diubah Saat Program Berjalan)

Tuliskan kata kunci const di depan literal: elemen tidak dapat ditambah, dihapus atau diubah selama eksekusi program:

void main() {
	var constantList = const [1,2,3];
	constantList[1] = 100; // Galat kompilasi
}
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
Unsupported operation: Cannot modify an unmodifiable list
#0      UnmodifiableListMixin.[]= (dart:_internal/list.dart:89:5)
#1      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:4:14)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#3      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)

III. Set Himpunan

Koleksi tanpa urutan dengan semua elemen bernilai unik

1. Karakteristik Inti Set

  • Tidak terurut: elemen tidak memiliki indeks tetap, tidak bisa dibaca atau diubah dengan sintaks [indeks]
  • Elemen unik: data duplikat akan dihapus secara otomatis. Menambahkan elemen yang sama tidak menimbulkan galat, hanya satu salinan yang tersimpan
  • Simbol Literal: kurung kurawal {}
  • Pembatasan Generik: dapat dibatasi hanya untuk satu tipe data; memasukkan elemen tipe lain akan memicu galat kompilasi atau galat runtime

Cara Membedakan Set Kosong dan Map Kosong (Sumber Kebingungan Pemula)

Simbol {} secara bawaan dibaca sebagai Map. Untuk membuat Set kosong, generik harus ditulis secara eksplisit

void main() {
	// Himpunan kosong tipe String
	var names = <String>{};
	Set<String> names2 = {}; // Penulisan yang setara

	// Tanpa anotasi generik, Dart akan mengenalinya sebagai Map<dynamic, dynamic>
	var names3 = {};
}
Penentuan Tipe Otomatis
void main() {
	// Tipe otomatis terdeteksi sebagai Set<String>
	var halogens = {'dog', 'cat', 'horse'};

	// Tipe otomatis terdeteksi sebagai Set<int>
	var nums = {1, 2, 6, 2}; // Angka duplikat 2 akan dihapus otomatis, hasil akhir {1,2,6}

	// Tipe campuran → terdeteksi sebagai Set<Object> (tidak disarankan, pemeriksaan tipe hilang)
	var mix = {1, "apple"};
}

Setelah tipe ditentukan, penambahan elemen tipe berbeda akan menghasilkan galat

void main() {
  // Literal hanya berisi teks → tipe terdeteksi Set<String>
  var animals = {'dog'};
  print(animals.runtimeType); // _CompactLinkedHashSet<String>

  // Menambahkan teks tipe sama tanpa galat
  animals.add('cat');
  animals.add('pig');
  print(animals); // {dog, cat, pig}
  
  // Galat: fungsi add mengharapkan tipe String, namun menerima bilangan bulat
  animals.add(1); 
}

2. Menambah, Menghapus dan Jumlah Elemen Himpunan

  • Tambah satu elemen: .add();
  • Tambah banyak elemen sekaligus: .addAll();
  • Mendapatkan total seluruh elemen: .length;
var elements = <String>{};
elements.add('fluorine');
elements.addAll({'chlorine', 'bromine'});
print(elements.length); //3

3. Set Konstan

Tuliskan const di depan literal: penambahan dan penghapusan elemen tidak diizinkan:

final constantSet = const {'fluorine', 'chlorine'};
// constantSet.add('helium'); // Akan menimbulkan galat

IV. Map Peta (Pasangan Kunci-Nilai)

1. Karakteristik Dasar
  • Menyimpan data berformat pasangan Kunci-Nilai;
  • Kunci bersifat unik di seluruh peta, nilai dapat digunakan berulang kali;
  • Kunci maupun nilai dapat berupa tipe objek apapun;
  • Format literal: {kunci: nilai};
  • Penentuan tipe otomatis:
void main() {
	var gifts = {'first': 'partridge'}; // Tipe otomatis Map<String, String> 
	
	var nobleGases = {2: 'helium'}; // Tipe otomatis Map<int, String>
}
2. Dua Cara Membuat Map
  • Pembuatan melalui literal
var gifts = {'first': 'partridge'};  
  • Pembuatan melalui konstruktor Map (kata kunci new dapat dihilangkan)
// Penulisan konstruktor
var gifts = Map<String, String>();
gifts['first'] = 'partridge';
3. Menambah, Membaca dan Jumlah Pasangan Peta
  1. Tambah / timpa pasangan kunci-nilai: map[kunci] = nilai;
  2. Mendapatkan nilai berdasarkan kunci: map[kunci]; mengembalikan null jika kunci tidak ada;
  3. Mendapatkan total pasangan kunci-nilai: .length;
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Tambah pasangan baru
print(gifts['first']); // Membaca nilai
print(gifts['fifth']);// Membaca kunci yang tidak terdaftar
print(gifts.length); // Melihat jumlah pasangan 
4. Map Konstan

Tuliskan const di depan literal: pasangan kunci-nilai tidak dapat diubah:

final constantMap = const {2: 'helium', 10: 'neon'};
// constantMap[2] = 'Helium'; // Akan menimbulkan galat

V. Elemen Perluasan di Literal Koleksi

Semua literal koleksi mendukung berbagai sintaks khusus, dibagi menjadi dua kelompok: elemen dasar dan elemen alur kendali untuk mempermudah pembuatan koleksi data.

  1. Elemen dasar: ekspresi sederhana, pasangan kunci-nilai, elemen aman null
  2. Elemen alur kendali: operator spread, perintah if, perulangan for, kombinasi bersarang

1. Elemen Ekspresi Sederhana

Cara penulisan paling sederhana: tulis langsung ekspresi, hasilnya akan dimasukkan ke koleksi. Pada contoh berikut elemen kedua merupakan hasil perhitungan 2 * 3, hasil output akhir [1, 6, text]

void main() {
	var list = [1, 2 * 3, 'text'];
	print(list); //[1, 6, text]
}

2. Elemen Kunci-Nilai

Hanya berlaku untuk literal Map, format ekspresiKunci : ekspresiNilai. Pada contoh di bawah kunci dan nilai elemen pertama masing-masing dihasilkan dari ekspresi perhitungan.

void main() {
	var map = {1+1: 3*8, 'name': 'apple'};
	print(map); //{2: 24, name: apple}
}

3. Elemen Aman Null (Dart ≥3.8)

Sintaks ?ekspresi: elemen hanya akan dimasukkan jika hasil ekspresi bukan null; jika bernilai null maka akan diabaikan sepenuhnya

Penggunaan pada List: variabel a bernilai null sehingga tidak muncul di hasil akhir tanpa galat

int? a = null;
int? b = 3;
var items = [1, ?a, ?b, 5]; // [1, 3, 5]

Penggunaan pada Map: simbol ? dapat ditempatkan sebelum kunci maupun sebelum nilai

String? k = null;
int? v = null;
var m = {?k: ?v}; // Jika kunci ATAU nilai bernilai null, seluruh pasangan akan dihapus

4. Operator Spread (Penyebaran Koleksi)

① Spread Biasa ...

Menyebarkan seluruh elemen koleksi yang dapat diiterasi lalu memasukkannya; tidak dapat menyebarkan koleksi bernilai null

var a = [1,2,3];
var items = [0, ...a, 4]; // [0,1,2,3,4]
② Spread Aman Null ...?

Cocok untuk koleksi tipe nullable: jika koleksi bernilai null maka akan diabaikan tanpa galat;

Jika koleksi tidak null namun memiliki elemen null di dalamnya, elemen null tersebut akan tetap tersimpan

List<int>? a = null;
var b = [1, null, 3];
var items = [0, ...?a, ...?b, 4]; // [0, 1, null, 3, 4]

Aturan wajib: koleksi dengan tipe nullable harus menggunakan ...?, jika tidak akan muncul galat kompilasi.

5. Elemen If (Kondisional)

Perintah if dapat ditulis langsung di dalam koleksi; isi hanya dimasukkan jika kondisi bernilai benar. Mendukung pemeriksaan boolean, pencocokan pola if-case dan cabang else

Pemeriksaan Boolean Sederhana
void main() {
	bool flag = true;
    var list = [0, if(flag) 1 else 99, 2];
	print(list); //[0, 1, 2]
}
Pencocokan Pola if-case (Penguraian Tipe dan Larangan)
void main() {
	Object data = 123;
	var info = [
	  if(data case int i) 'Angka: $i',
	  if(data case String s) 'Teks: $s'
	];
	print(info); //[Angka: 123]
}

Karena variabel data bertipe int, hanya bagian “Angka: 123” yang dimasukkan, bagian teks diabaikan

6. Elemen For (Perulangan)

Tulis perulangan for langsung di dalam koleksi untuk menghasilkan banyak elemen sekaligus. Mendukung sintaks for-in dan perulangan tiga bagian standar

var nums = [2,3,4];

// for-in
var list1 = [1, for(var n in nums) n*n, 7]; // [1,4,9,16,7]

// Perulangan tiga bagian
var list2 = [1, for(var x=5; x>2; x--) x, 7]; // [1,5,4,3,7]

7. Alur Kendali Bersarang

if, for dan operator spread dapat disarangkan secara bebas di banyak tingkat, fungsinya mirip pemahaman daftar pada bahasa pemrograman lain

Contoh: hanya simpan bilangan genap

var numbers = [1,2,3,4,5,6];
var items = [
  0,
  for(var n in numbers)
    if(n.isEven) n,
  8
]; // [0,2,4,6,8]

Contoh: perulangan bersarang + if + operator spread

void main() {
	var ys = [1,2,3];
	var nest = [
	  ...[
		for(var x=0;x<2;x++)
		  for(var y in ys)
			if(x<y) x+y*10
	  ]
	];
	print(nest); //[10, 20, 30, 21, 31]
}

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *