Masukkan Password
39 4.1 List in Dart Programming Language | List in More Details | Learn Dart Language | Dart Course
Materi ini jauh lebih panjang daripada materi sebelumnya karena sekarang kita membahas List di Dart secara mendalam. Saya akan menjelaskannya dari konsep paling dasar sampai bagian where, map, dan mixed list.
Catatan penting: beberapa kata pada caption salah terbaca, misalnya “DOT” sebenarnya Dart, dan beberapa nama fungsi juga terdengar tidak jelas. Saya akan menggunakan istilah dan syntax Dart yang benar.
1. Apa itu List?
List adalah sebuah collection yang digunakan untuk menyimpan banyak nilai dalam satu variabel.
Misalnya kita mempunyai nama beberapa siswa:
List<String> names = [
"Ali",
"Budi",
"Citra"
];
Daripada membuat:
String name1 = "Ali";
String name2 = "Budi";
String name3 = "Citra";
kita cukup membuat satu variabel:
List<String> names = [
"Ali",
"Budi",
"Citra"
];
Jadi sederhananya:
List = satu variabel yang bisa menyimpan banyak data secara berurutan.
2. Kenapa List mirip Array?
Kalau sebelumnya kamu pernah belajar bahasa seperti C, C++, Java, atau JavaScript, kamu mungkin mengenal istilah array.
List di Dart memiliki konsep yang mirip dengan array.
Misalnya:
List:
[10, 20, 30, 40]
Data tersebut mempunyai posisi:
Index: 0 1 2 3
↓ ↓ ↓ ↓
Value: 10 20 30 40
Jadi setiap elemen mempunyai index.
Dan yang sangat penting:
Index dimulai dari 0.
3. Dua jenis List
Materi menjelaskan dua jenis List:
List
│
├── Growable List
│
└── Fixed-length List
Mari kita bedakan.
4. Growable List
Growable List adalah List yang ukurannya bisa berubah.
Contoh:
List<String> names = [
"Ali",
"Budi"
];
Sekarang jumlah elemen:
2
Kita bisa menambahkan elemen:
names.add("Citra");
Sekarang:
["Ali", "Budi", "Citra"]
Jumlah elemen menjadi:
3
Kita juga dapat menghapus elemen sehingga jumlahnya berkurang.
Jadi:
Growable List = ukuran List dapat bertambah atau berkurang selama program berjalan.
5. Fixed-length List
Kebalikannya adalah Fixed-length List.
Fixed-length berarti ukuran List sudah ditentukan dari awal.
Misalnya:
List<int> numbers = List.filled(5, 10);
Artinya:
Panjang List = 5
Nilai setiap elemen = 10
Hasilnya:
[10, 10, 10, 10, 10]
Index-nya:
Index: 0 1 2 3 4
Value: 10 10 10 10 10
Jumlah elemennya selalu 5.
6. Fixed-length tidak berarti nilainya tidak bisa berubah
Ini bagian yang sering membingungkan.
Fixed-length berarti:
Jumlah/ukuran List tidak bisa diubah.
Tetapi isi elemennya masih bisa diubah jika List tersebut mutable.
Misalnya:
List<int> numbers = List.filled(5, 10);
numbers[0] = 20;
Hasilnya:
[20, 10, 10, 10, 10]
Yang berubah adalah nilai elemen, bukan panjang List.
Tetapi kalau kita melakukan:
numbers.add(30);
akan terjadi error karena kita mencoba menambah jumlah elemen.
7. Perbedaan Growable dan Fixed-length
| Growable | Fixed-length |
|---|---|
| Ukuran bisa berubah | Ukuran tidak bisa berubah |
Bisa add() | Tidak bisa add() |
| Bisa menghapus elemen | Tidak bisa menghapus sehingga panjang berubah |
| Cocok untuk data dinamis | Cocok jika jumlah elemen sudah diketahui |
Contoh mudah:
Growable:
[10, 20, 30]
↓ add
[10, 20, 30, 40]
Fixed-length:
[10, 20, 30]
Jumlahnya sudah ditentukan. Kita tidak bisa membuatnya menjadi:
[10, 20, 30, 40]
dengan add().
8. Mengakses elemen List dengan Index
Misalnya:
List<int> numbers = [
3,
56,
65,
34
];
Posisinya:
Index: 0 1 2 3
↓ ↓ ↓ ↓
Value: 3 56 65 34
Kalau ingin mengambil angka 3:
numbers[0]
Hasil:
3
Untuk 56:
numbers[1]
Hasil:
56
Untuk 65:
numbers[2]
Hasil:
65
Untuk 34:
numbers[3]
Hasil:
34
9. Kenapa index terakhir adalah 3, bukan 4?
List kita mempunyai 4 elemen:
3
56
65
34
Tetapi index dimulai dari 0:
0 → 3
1 → 56
2 → 65
3 → 34
Jadi:
length = 4
last index = 3
Rumus sederhananya:
last index = length - 1
Jadi kalau:
length = 10
index terakhir:
9
Ini sangat penting saat bekerja dengan List.
10. Apa yang terjadi jika index tidak ada?
Misalnya:
numbers[4]
Padahal index yang tersedia hanya:
0, 1, 2, 3
Maka akan terjadi exception/error karena index 4 tidak ada.
Jadi sebelum mengakses:
numbers[index]
pastikan index tersebut berada dalam range yang valid.
11. Mencari index berdasarkan nilai
Dart juga menyediakan:
indexOf()
Misalnya:
List<int> numbers = [
3,
56,
65,
34
];
Kita ingin mengetahui posisi 65.
numbers.indexOf(65)
Hasil:
2
Karena:
Index 0 → 3
Index 1 → 56
Index 2 → 65
12. Bagaimana jika nilainya tidak ditemukan?
Misalnya:
numbers.indexOf(100)
Padahal 100 tidak ada.
Hasilnya:
-1
Artinya:
Nilai tersebut tidak ditemukan di dalam List.
Jadi jangan menganggap -1 sebagai index yang valid.
13. Mengetahui panjang List dengan length
Untuk mengetahui jumlah elemen:
numbers.length
Misalnya:
[3, 56, 65, 34]
maka:
length = 4
Contoh:
print(numbers.length);
Output:
4
Perhatikan:
length = 4
last index = 3
Jangan sampai tertukar.
14. Mengubah nilai dalam List
List biasa di Dart bersifat mutable, artinya elemen di dalamnya dapat diubah.
Misalnya:
List<int> numbers = [
3,
56,
65,
34
];
Kita ingin mengubah 3 menjadi 50.
Index 3 adalah 0.
Jadi:
numbers[0] = 50;
Sekarang:
[50, 56, 65, 34]
Inilah yang disebut modifikasi/mutasi List.
15. Apa itu Mutable?
Mutable berarti:
Objek tersebut masih dapat diubah setelah dibuat.
Contoh:
List<int> numbers = [10, 20, 30];
numbers[0] = 100;
Hasil:
[100, 20, 30]
List-nya masih sama, tetapi isinya berubah.
16. Bagaimana dengan const?
Kalau kita membuat:
const numbers = [10, 20, 30];
List tersebut tidak dapat dimodifikasi.
Misalnya:
numbers[0] = 100;
akan menghasilkan error.
Begitu juga:
numbers.add(40);
tidak diperbolehkan.
Jadi:
List biasa → bisa dimodifikasi
const List → tidak bisa dimodifikasi
Catatan penting
Secara konsep, lebih tepat menyebut const List sebagai immutable dari sisi isi dan struktur. final berbeda: final membuat variabel tidak bisa menunjuk ke List lain, tetapi isi List-nya masih bisa diubah.
Contoh:
final numbers = [10, 20, 30];
numbers[0] = 100; // boleh
Tetapi:
numbers = [1, 2, 3]; // tidak boleh
Ini perbedaan final dan const yang penting untuk dipahami.
17. Mengambil elemen pertama dan terakhir
Daripada menghitung index sendiri, Dart menyediakan:
first
dan:
last
Misalnya:
List<int> numbers = [
3,
56,
65,
34
];
Elemen pertama:
numbers.first
hasil:
3
Elemen terakhir:
numbers.last
hasil:
34
Jadi kita tidak perlu menulis:
numbers[numbers.length - 1]
cukup:
numbers.last
Lebih mudah dibaca.
18. Mengecek apakah List kosong dengan isEmpty
Dart mempunyai:
isEmpty
yang menghasilkan Boolean:
true
atau:
false
Misalnya:
List<int> numbers = [10, 20, 30];
print(numbers.isEmpty);
Hasil:
false
Karena List masih memiliki data.
Kalau:
List<int> numbers = [];
maka:
numbers.isEmpty
hasil:
true
19. isNotEmpty
Kebalikan dari isEmpty adalah:
isNotEmpty
Misalnya:
List<int> numbers = [10, 20, 30];
print(numbers.isNotEmpty);
hasil:
true
Karena List mempunyai isi.
Jika:
List<int> numbers = [];
maka:
numbers.isNotEmpty
hasil:
false
Cara mengingat:
isEmpty
↓
"Apakah kosong?"
isNotEmpty
↓
"Apakah tidak kosong?"
20. Mengosongkan List dengan clear()
Kalau kita ingin menghapus semua elemen:
numbers.clear();
Misalnya:
Sebelum:
[10, 20, 30, 40]
clear()
Sesudah:
[]
Setelah itu:
numbers.isEmpty
akan menghasilkan:
true
21. Membalik List dengan reversed
Misalnya:
List<int> numbers = [
3,
56,
65
];
Kita ingin membalik urutannya:
[65, 56, 3]
Dart menyediakan:
numbers.reversed
Tetapi ada hal penting.
reversed menghasilkan Iterable, bukan langsung List.
Karena itu jika kita membutuhkan List:
numbers.reversed.toList()
Hasil:
[65, 56, 3]
22. Menambahkan satu elemen dengan add()
Misalnya:
List<int> numbers = [
3,
56,
65
];
Kemudian:
numbers.add(33);
Hasil:
[3, 56, 65, 33]
add() menambahkan elemen ke bagian akhir List.
Jadi:
add()
↓
tambahkan satu elemen
↓
di akhir List
23. Menambahkan elemen pada posisi tertentu dengan insert()
Misalnya:
[3, 56, 65]
Kita ingin memasukkan 45 di antara 3 dan 56.
Index-nya:
0 → 3
1 → 56
2 → 65
Kita dapat menggunakan:
numbers.insert(1, 45);
Hasil:
[3, 45, 56, 65]
Kenapa index 1?
Karena kita mengatakan:
“Masukkan
45mulai posisi index 1.”
24. addAll() untuk menambahkan banyak data
Kalau ingin menambahkan beberapa elemen sekaligus:
numbers.addAll([55, 99]);
Misalnya awalnya:
[3, 56, 65]
setelah:
addAll([55, 99])
menjadi:
[3, 56, 65, 55, 99]
Jadi:
add() → satu elemen
addAll() → banyak elemen
25. insertAll() untuk memasukkan banyak elemen pada posisi tertentu
Misalnya:
[3, 56, 65]
Kita ingin memasukkan:
46, 45
setelah 56.
Index sebelum 65 adalah 2.
Kita dapat menggunakan:
numbers.insertAll(2, [46, 45]);
Hasil:
[3, 56, 46, 45, 65]
Jadi:
insert()
→ satu elemen pada posisi tertentu
insertAll()
→ banyak elemen pada posisi tertentu
26. replaceRange()
Sekarang kita masuk ke operasi yang sedikit lebih menarik.
replaceRange() digunakan untuk mengganti beberapa elemen sekaligus.
Misalnya:
[3, 56, 65, 46, 39]
Kita ingin mengganti tiga elemen pertama:
3
56
65
dengan:
11
22
33
Kita bisa menggunakan konsep:
numbers.replaceRange(0, 3, [11, 22, 33]);
Hasil:
[11, 22, 33, 46, 39]
27. Kenapa replaceRange(0, 3) mengganti index 0, 1, 2?
Ini konsep yang sangat penting.
Range Dart umumnya berbentuk:
[start, end)
Artinya:
starttermasuk,endtidak termasuk.
Jadi:
0 sampai 3
berarti:
0
1
2
tetapi:
3
tidak termasuk.
Konsep ini disebut end-exclusive.
28. Contoh memahami range
Misalnya:
numbers.replaceRange(1, 4, [100, 200, 300]);
Range:
1, 2, 3
Index 4 tidak ikut.
Jadi selalu ingat:
[start, end)
↑ ↑
ikut tidak ikut
Konsep ini akan sering muncul di Dart dan bahasa pemrograman lain.
29. Menghapus berdasarkan nilai dengan remove()
Misalnya:
List<int> numbers = [
3,
56,
65,
46
];
Kita ingin menghapus 65.
Gunakan:
numbers.remove(65);
Hasil:
[3, 56, 46]
Perhatikan bahwa yang kita berikan adalah nilai, bukan index.
30. Bagaimana jika nilai tidak ada?
Misalnya:
numbers.remove(100);
Padahal 100 tidak ada.
Tidak ada perubahan pada List.
Jadi:
remove(65)
→ 65 ditemukan
→ dihapus
remove(100)
→ 100 tidak ditemukan
→ List tetap
31. Menghapus berdasarkan index dengan removeAt()
Kalau kita ingin menghapus berdasarkan index, gunakan:
removeAt()
Misalnya:
[3, 56, 65, 46]
Kita ingin menghapus elemen pertama.
Index pertama:
0
Maka:
numbers.removeAt(0);
Hasil:
[56, 65, 46]
Perbedaannya:
remove(value)
↓
hapus berdasarkan nilai
removeAt(index)
↓
hapus berdasarkan index
32. Hati-hati dengan removeAt()
Kalau List hanya mempunyai:
[10, 20, 30]
index yang tersedia:
0, 1, 2
Kalau kita melakukan:
numbers.removeAt(100);
akan terjadi error karena index 100 tidak ada.
33. Menghapus elemen terakhir dengan removeLast()
Kalau ingin menghapus elemen terakhir:
numbers.removeLast();
Misalnya:
[3, 56, 65, 46]
Setelah:
removeLast()
menjadi:
[3, 56, 65]
Tidak perlu mencari index terakhir secara manual.
34. removeRange()
Kalau ingin menghapus beberapa elemen sekaligus berdasarkan range:
numbers.removeRange(0, 3);
Ini akan menghapus:
index 0
index 1
index 2
Index 3 tidak ikut.
Sekali lagi:
removeRange(start, end)
↑
tidak termasuk
35. removeWhere() — menghapus berdasarkan kondisi
Ini salah satu bagian yang paling penting.
Misalnya kita mempunyai:
[3, 12, 20, 5, 30]
Kita ingin menghapus semua angka yang lebih besar dari 10.
Kita bisa menggunakan:
numbers.removeWhere((element) => element > 10);
Sebelum:
[3, 12, 20, 5, 30]
Kondisi:
element > 10
Maka:
12 → hapus
20 → hapus
30 → hapus
Yang tersisa:
[3, 5]
Jadi:
removeWhere()digunakan untuk menghapus elemen berdasarkan kondisi.
36. Contoh removeWhere() untuk angka genap
Dart mempunyai:
element.isEven
yang menghasilkan Boolean.
Misalnya:
10 → true
11 → false
12 → true
13 → false
Kalau kita ingin menghapus semua angka genap:
numbers.removeWhere((element) => element.isEven);
Misalnya:
[1, 2, 3, 4, 5, 6]
Setelah:
removeWhere(isEven)
menjadi:
[1, 3, 5]
Karena semua angka genap dihapus.
37. Loop pada List
Kita juga dapat melakukan perulangan terhadap List.
Misalnya:
List<int> numbers = [
10,
20,
30
];
Kita ingin mencetak semua angka.
Salah satu cara:
for (var number in numbers) {
print(number);
}
Hasil:
10
20
30
Ini disebut for-in loop.
38. Menggunakan forEach()
Cara lainnya:
numbers.forEach((element) {
print(element);
});
Artinya:
Jalankan kode tersebut untuk setiap elemen di dalam List.
Kalau List:
[10, 20, 30]
maka fungsi dijalankan tiga kali:
element = 10
element = 20
element = 30
39. map() — mengubah setiap elemen
Ini bagian yang sangat penting.
Misalnya kita mempunyai:
[1, 2, 3, 4, 5]
Kita ingin mengalikan semuanya dengan 2.
Daripada mengubah satu per satu:
1 × 2 = 2
2 × 2 = 4
3 × 2 = 6
4 × 2 = 8
5 × 2 = 10
kita dapat menggunakan map().
Konsepnya:
numbers.map((element) => element * 2)
Hasilnya secara konsep:
[2, 4, 6, 8, 10]
Biasanya kita ubah kembali menjadi List:
numbers.map((element) => element * 2).toList();
40. Kenapa menggunakan map()?
map() sangat berguna ketika kita ingin:
Mengubah setiap elemen menjadi bentuk baru.
Misalnya:
[1, 2, 3]
ubah menjadi:
[10, 20, 30]
Atau:
["budi", "andi"]
ubah menjadi:
["BUDI", "ANDI"]
Atau harga:
[100, 200, 300]
ubah menjadi:
[110, 220, 330]
Intinya:
List lama
↓
map()
↓
List baru
41. map() vs where()
Ini wajib dibedakan.
map()
Digunakan untuk mengubah data.
Misalnya:
[1, 2, 3]
menjadi:
[2, 4, 6]
where()
Digunakan untuk memilih/filter data.
Misalnya:
[1, 2, 3, 4, 5]
ambil angka genap:
[2, 4]
Jadi:
map → mengubah
where → menyaring
Cara mudah mengingat:
MAP = Modify WHERE = Which ones?
42. Menggabungkan dua List dengan +
Misalnya:
List<String> names1 = [
"Ali",
"Budi"
];
List<String> names2 = [
"Citra",
"Doni"
];
Kita bisa menggabungkannya:
List<String> combined = names1 + names2;
Hasil:
[Ali, Budi, Citra, Doni]
Operator + dapat digunakan untuk menggabungkan List.
43. Menggabungkan List dengan Spread Operator ...
Cara lain adalah menggunakan spread operator:
List<String> combined = [
...names1,
...names2
];
Hasilnya sama:
[Ali, Budi, Citra, Doni]
... dapat dibaca secara sederhana sebagai:
“Masukkan semua isi collection ini ke sini.”
44. Apa maksud ...?
Misalnya:
List<int> a = [1, 2, 3];
Kalau kita menulis:
[...a]
hasilnya:
[1, 2, 3]
Kalau:
[0, ...a, 4]
hasilnya:
[0, 1, 2, 3, 4]
Jadi spread operator sangat berguna untuk membuat List baru berdasarkan List yang sudah ada.
45. Conditional element di dalam List
Dart juga memungkinkan kita memasukkan elemen berdasarkan kondisi.
Misalnya:
bool isMerit = false;
Kemudian:
List<String> names = [
"Ali",
if (isMerit) "Budi"
];
Kalau:
isMerit = false
hasil:
[Ali]
Karena "Budi" tidak dimasukkan.
Kalau:
isMerit = true;
hasil:
[Ali, Budi]
Jadi:
if (kondisi)
↓
true → elemen dimasukkan
false → elemen tidak dimasukkan
Ini disebut collection if.
46. where() untuk filtering
Sekarang kita masuk ke bagian terakhir yang dibahas cukup panjang dalam tutorial.
Misalnya:
List<int> numbers = [
1,
2,
3,
4,
5,
6
];
Kita hanya ingin mendapatkan angka genap.
Kita bisa menggunakan:
var even = numbers.where((element) => element.isEven).toList();
Hasil:
[2, 4, 6]
47. Bagaimana where() bekerja?
Bayangkan ada sebuah mesin filter:
[1, 2, 3, 4, 5, 6]
│
↓
where(isEven)
│
↓
[2, 4, 6]
Setiap elemen diperiksa:
1 → genap? false → tidak masuk
2 → genap? true → masuk
3 → genap? false → tidak masuk
4 → genap? true → masuk
5 → genap? false → tidak masuk
6 → genap? true → masuk
Hasil akhirnya:
[2, 4, 6]
48. Arrow function pada where()
Bagian ini:
(element) => element.isEven
adalah arrow function.
Artinya kurang lebih:
(element) {
return element.isEven;
}
Jadi dua bentuk ini secara konsep sama:
Arrow function
(element) => element.isEven
Function biasa
(element) {
return element.isEven;
}
Arrow function hanya merupakan cara yang lebih singkat.
49. Mixed List
Bagian terakhir membahas mixed List.
Misalnya kita membuat:
var mixed = [
10,
10.5,
"Hello"
];
Di sini terdapat:
10 → int
10.5 → double
"Hello" → String
Jadi satu List berisi beberapa tipe data.
50. Kenapa bisa berbeda tipe?
Karena kalau kita tidak memberikan tipe secara eksplisit, Dart dapat melakukan inference terhadap List tersebut dan pada kasus seperti ini tipe elemennya menjadi dynamic.
Kita juga bisa menuliskannya secara eksplisit:
List<dynamic> mixed = [
10,
10.5,
"Hello"
];
Sekarang kita secara jelas mengatakan:
List ini boleh menyimpan berbagai tipe nilai.
51. Tapi apakah dynamic selalu bagus?
Tidak selalu.
dynamic memang fleksibel:
List<dynamic> data = [
10,
"Hello",
20.5,
true
];
Tetapi kita kehilangan sebagian keuntungan type safety.
Misalnya compiler tidak dapat membantu kita sebaik ketika kita menggunakan:
List<int>
karena List<int> secara jelas hanya boleh berisi integer.
Untuk program yang besar, sebaiknya gunakan tipe yang spesifik jika memungkinkan.
Misalnya:
List<int> numbers
lebih aman daripada:
List<dynamic> numbers
jika memang datanya hanya angka integer.
52. Ringkasan semua operasi List
Setelah mempelajari seluruh tutorial, kamu bisa membuat peta seperti ini:
LIST
│
├── Membuat
│ └── [1, 2, 3]
│
├── Mengakses
│ └── list[index]
│
├── Mencari index
│ └── indexOf()
│
├── Ukuran
│ └── length
│
├── Elemen pertama
│ └── first
│
├── Elemen terakhir
│ └── last
│
├── Mengecek kosong
│ ├── isEmpty
│ └── isNotEmpty
│
├── Menghapus semua
│ └── clear()
│
├── Membalik
│ └── reversed.toList()
│
├── Menambah
│ ├── add()
│ ├── addAll()
│ ├── insert()
│ └── insertAll()
│
├── Mengubah
│ ├── list[index] = value
│ └── replaceRange()
│
├── Menghapus
│ ├── remove()
│ ├── removeAt()
│ ├── removeLast()
│ ├── removeRange()
│ └── removeWhere()
│
├── Perulangan
│ ├── for
│ ├── for-in
│ └── forEach()
│
├── Transformasi
│ └── map()
│
├── Filter
│ └── where()
│
├── Menggabungkan
│ ├── +
│ └── ...
│
└── Conditional
└── if
53. Yang paling penting untuk dihafal
Kalau kamu masih pemula, jangan mencoba menghafal semuanya sekaligus.
Fokus dulu pada 10 hal ini:
| Syntax | Fungsi |
|---|---|
list[index] | mengambil data berdasarkan index |
length | mengetahui jumlah elemen |
indexOf() | mencari index |
add() | menambah satu data |
addAll() | menambah banyak data |
remove() | menghapus berdasarkan nilai |
removeAt() | menghapus berdasarkan index |
clear() | menghapus semua data |
map() | mengubah setiap elemen |
where() | memfilter elemen |
Kemudian pahami konsep:
Index dimulai dari 0
↓
length = jumlah data
↓
last index = length - 1
Dan pahami perbedaan:
add → tambah di akhir
insert → tambah di posisi tertentu
remove → hapus berdasarkan nilai
removeAt → hapus berdasarkan index
map → ubah data
where → filter data
54. Contoh lengkap
Sekarang kita gabungkan beberapa materi menjadi satu contoh sederhana:
List<int> numbers = [1, 2, 3, 4, 5];
print(numbers.length);
print(numbers.first);
print(numbers.last);
numbers.add(6);
numbers[0] = 10;
numbers.remove(3);
var even = numbers
.where((number) => number.isEven)
.toList();
print(numbers);
print(even);
Mari kita ikuti:
Awalnya:
[1, 2, 3, 4, 5]
Setelah:
numbers.add(6);
menjadi:
[1, 2, 3, 4, 5, 6]
Setelah:
numbers[0] = 10;
menjadi:
[10, 2, 3, 4, 5, 6]
Setelah:
numbers.remove(3);
menjadi:
[10, 2, 4, 5, 6]
Kemudian:
where((number) => number.isEven)
memilih angka genap:
[10, 2, 4, 6]
Jadi kita sudah menggunakan:
List
↓
index
↓
add
↓
update
↓
remove
↓
where/filter
Kesimpulan besar
Materi ini sebenarnya ingin mengajarkan bahwa List bukan sekadar tempat menyimpan banyak angka atau String. List adalah salah satu struktur data utama yang akan sangat sering kamu gunakan ketika membuat program Dart.
Pahami alurnya seperti ini:
Banyak data
↓
LIST
↓
┌───────────────────────┐
│ Akses → index │
│ Tambah → add │
│ Hapus → remove │
│ Ubah → assignment │
│ Cari → indexOf │
│ Filter → where │
│ Ubah → map │
│ Loop → forEach │
└───────────────────────┘
Dan ada 4 konsep yang menurut saya paling wajib kamu kuasai sebelum lanjut ke materi berikutnya:
1. Index → untuk mengakses data
2. Mutable vs immutable → untuk memahami apakah data bisa diubah
3. map() → untuk mengubah setiap data
4. where() → untuk menyaring data berdasarkan kondisi
Kalau empat konsep tersebut sudah benar-benar kamu pahami, kamu sudah mempunyai fondasi yang kuat untuk melanjutkan ke Map dan Set di Dart.