Masukkan Password
14 Dart Set Methods & Properties | Dart Tutorials #13
Video ini membahas property dan method yang sering dipakai pada Set di Dart. Saya jelaskan dari dasar, lalu kita bedah satu per satu dengan contoh sederhana.
Catatan penting: di transkrip ada beberapa hasil speech-to-text yang salah, misalnya “state”, “shade”, atau “where”. Yang dimaksud sebenarnya adalah
Set, dan “where” adalah methodwhere().
1. Mengingat kembali: apa itu Set?
Sebelum masuk ke method, ingat konsep dasarnya.
Set adalah collection yang digunakan untuk menyimpan data yang unik.
var fruits = {'mango', 'apple', 'cherry'};
Hasilnya:
{mango, apple, cherry}
Kalau kita memasukkan data yang sama:
var fruits = {'mango', 'apple', 'mango'};
Maka mango hanya muncul satu kali:
{mango, apple}
Jadi prinsip utama Set adalah:
Tidak boleh ada duplicate value.
Berbeda dengan List:
var fruits = ['mango', 'apple', 'mango'];
Hasilnya:
[mango, apple, mango]
2. Property pada Set
Video pertama-tama membahas beberapa property yang umum digunakan.
Misalnya:
var fruits = {'mango', 'apple', 'cherry', 'orange'};
A. length
Untuk mengetahui jumlah elemen:
print(fruits.length);
Output:
4
Karena ada 4 buah.
B. first
Untuk mengambil elemen pertama berdasarkan urutan iterasi:
print(fruits.first);
Pada Set default Dart (LinkedHashSet), biasanya:
mango
C. last
Untuk mengambil elemen terakhir:
print(fruits.last);
Biasanya:
orange
Catatan: walaupun Set default mempertahankan insertion order, sebaiknya jangan memperlakukan Set seperti List. Set bukan collection yang dirancang untuk akses berdasarkan posisi/index.
D. isEmpty
Untuk mengecek apakah Set kosong:
print(fruits.isEmpty);
Hasil:
false
Karena fruits memiliki data.
Kalau:
var fruits = <String>{};
print(fruits.isEmpty);
Hasil:
true
E. isNotEmpty
Kebalikan dari isEmpty.
print(fruits.isNotEmpty);
Kalau ada data:
true
3. Method add()
add() digunakan untuk menambahkan satu elemen ke dalam Set.
Contoh:
var fruits = {'mango', 'apple', 'cherry'};
fruits.add('orange');
print(fruits);
Hasil:
{mango, apple, cherry, orange}
Bagaimana kalau data sudah ada?
Misalnya:
fruits.add('mango');
mango sudah ada.
Maka Dart tidak menambahkan mango untuk kedua kalinya.
Jadi tetap:
{mango, apple, cherry, orange}
Tidak menjadi:
{mango, apple, cherry, orange, mango}
Ini salah satu keuntungan terbesar menggunakan Set.
4. Method addAll()
Kalau add() untuk menambahkan satu data, addAll() digunakan untuk menambahkan banyak data sekaligus.
Contoh:
var fruits = {'mango', 'apple', 'cherry'};
var myFruits = {'lemon', 'grapes'};
myFruits.addAll(fruits);
print(myFruits);
Awalnya:
myFruits = {lemon, grapes}
Kemudian kita tambahkan seluruh isi fruits:
mango
apple
cherry
Hasil akhirnya:
{lemon, grapes, mango, apple, cherry}
Kalau ada data yang sama, tetap hanya muncul satu kali.
5. remove()
remove() digunakan untuk menghapus satu elemen tertentu.
var fruits = {
'mango',
'lemon',
'apple',
'cherry',
'grapes'
};
fruits.remove('apple');
print(fruits);
Hasil:
{mango, lemon, cherry, grapes}
apple hilang.
Menariknya, remove() mengembalikan bool
Ini penting.
var result = fruits.remove('apple');
print(result);
Kalau apple memang ada dan berhasil dihapus:
true
Kalau apple tidak ada:
var result = fruits.remove('banana');
print(result);
Hasil:
false
Jadi:
remove()memberi tahu apakah data benar-benar berhasil dihapus atau tidak.
6. removeAll()
removeAll() digunakan untuk menghapus semua elemen yang juga terdapat pada collection lain.
Contoh:
var fruits = {
'mango',
'lemon',
'apple',
'cherry',
'grapes'
};
var myFruits = {'lemon', 'grapes'};
fruits.removeAll(myFruits);
print(fruits);
myFruits berisi:
{lemon, grapes}
Maka lemon dan grapes akan dihapus dari fruits.
Hasil:
{mango, apple, cherry}
7. clear()
Kalau remove() menghapus satu data dan removeAll() menghapus data tertentu berdasarkan collection lain, maka:
clear()
menghapus semua elemen.
Contoh:
var fruits = {'mango', 'apple', 'cherry'};
fruits.clear();
print(fruits);
Hasil:
{}
Set sekarang kosong.
clear() mengembalikan void, jadi kita tidak mendapatkan true/false seperti pada remove().
8. removeWhere()
Ini salah satu method yang sangat berguna.
removeWhere() digunakan untuk:
Menghapus semua elemen yang memenuhi kondisi tertentu.
Misalnya kita punya:
var names = {
'sam',
'john',
'mark',
'alex',
'james'
};
Kita ingin menghapus semua nama yang memiliki huruf "a".
names.removeWhere((name) {
return name.contains('a');
});
Mari lihat satu per satu:
sam → ada 'a' → hapus
john → tidak ada 'a' → simpan
mark → ada 'a' → hapus
alex → ada 'a' → hapus
james → ada 'a' → hapus
Hasil:
{john}
Bentuk singkat
Karena kondisi tersebut hanya satu baris, kita bisa menulis:
names.removeWhere((name) => name.contains('a'));
Ini sangat umum digunakan di Dart.
9. retainWhere()
Kalau removeWhere() berarti:
“Hapus yang memenuhi kondisi.”
Maka retainWhere() berarti:
“Pertahankan yang memenuhi kondisi, hapus sisanya.”
Misalnya:
var names = {
'sam',
'john',
'mark',
'alex',
'james'
};
names.retainWhere((name) => name.contains('a'));
Yang memiliki "a":
sam
mark
alex
james
Yang tidak memiliki "a":
john
Maka hasil akhirnya:
{sam, mark, alex, james}
Cara mudah mengingat
| Method | Yang dipertahankan |
|---|---|
removeWhere() | yang tidak memenuhi kondisi |
retainWhere() | yang memenuhi kondisi |
10. retainAll()
retainAll() mirip dengan retainWhere(), tetapi kriterianya berasal dari Set/collection lain.
Contoh:
var names = {
'alex',
'sam',
'john',
'mark'
};
var set1 = {
'alex',
'sam'
};
names.retainAll(set1);
print(names);
Hasil:
{alex, sam}
Artinya:
“Dari
names, hanya pertahankan data yang juga terdapat diset1.”
11. elementAt()
Set tidak mendukung akses index seperti List.
Pada List, kita bisa:
var names = ['sam', 'john', 'mark'];
print(names[0]);
Tetapi pada Set, kita tidak bisa:
names[0]; // ❌
Sebagai gantinya ada:
names.elementAt(0);
Contoh:
var names = {'sam', 'john', 'mark', 'alex'};
print(names.elementAt(0));
print(names.elementAt(1));
Pada LinkedHashSet, biasanya hasilnya:
sam
john
Tetapi perlu diingat:
Setbukan collection yang dirancang untuk akses berdasarkan index.
Kalau pekerjaanmu memang membutuhkan banyak akses berdasarkan index, gunakan List.
Bagaimana kalau index tidak ada?
Misalnya hanya ada 4 elemen:
index 0
index 1
index 2
index 3
Kemudian:
names.elementAt(10);
Maka akan terjadi:
RangeError
Karena index tersebut berada di luar jangkauan.
12. contains()
contains() digunakan untuk mengecek:
“Apakah elemen tertentu ada di dalam Set?”
Contoh:
var fruits = {'mango', 'apple', 'cherry'};
print(fruits.contains('apple'));
Hasil:
true
Karena apple ada.
Sedangkan:
print(fruits.contains('banana'));
Hasil:
false
Return type-nya adalah:
bool
Jadi hanya:
true
atau:
false
13. containsAll()
Kalau contains() mengecek satu elemen, containsAll() mengecek semua elemen dari collection lain.
Contoh:
var fruits = {
'mango',
'apple',
'cherry',
'lemon',
'grapes'
};
var myFruits = {
'lemon',
'grapes'
};
print(fruits.containsAll(myFruits));
Apakah lemon ada?
✅ Ya.
Apakah grapes ada?
✅ Ya.
Maka:
true
Kalau salah satu saja tidak ada, hasilnya:
false
14. lookup()
lookup() sekilas mirip dengan contains().
Tetapi ada perbedaan penting.
contains()
Menghasilkan:
true / false
lookup()
Menghasilkan:
elemen tersebut
atau:
null
Contoh:
var fruits = {'mango', 'apple', 'cherry'};
print(fruits.contains('apple'));
Output:
true
Sedangkan:
print(fruits.lookup('apple'));
Output:
apple
Kalau:
print(fruits.lookup('banana'));
Output:
null
Jadi gampangnya:
contains → "Ada atau tidak?"
lookup → "Kalau ada, berikan objeknya."
15. where()
where() sangat penting dan sering digunakan di Flutter/Dart.
Fungsinya:
Mengambil elemen-elemen yang memenuhi kondisi tertentu.
Contoh:
var names = {
'sam',
'john',
'mark',
'alex',
'james'
};
var result = names.where(
(name) => name.contains('a')
);
Yang memiliki "a":
sam
mark
alex
james
Jadi result berisi elemen-elemen tersebut.
Tapi ada hal penting
where() tidak mengembalikan Set secara langsung.
Hasilnya adalah:
Iterable<String>
Kalau kita ingin hasilnya menjadi Set, gunakan:
var result = names
.where((name) => name.contains('a'))
.toSet();
Jadi:
where()
↓
Iterable
↓
toSet()
↓
Set
16. whereType<T>()
Method ini sangat berguna ketika kita mempunyai collection dengan berbagai macam tipe data.
Misalnya:
var values = {
10,
'abc',
20.5,
'xyz',
30
};
Di sini terdapat:
int
String
double
Kalau kita hanya ingin mengambil String:
var strings = values.whereType<String>().toSet();
print(strings);
Hasil:
{abc, xyz}
Kalau hanya ingin mengambil int:
var integers = values.whereType<int>().toSet();
print(integers);
Hasil:
{10, 30}
Gampangnya:
whereType<String>()
berarti:
“Ambil hanya data yang bertipe
String.”
17. map()
map() juga sangat penting dalam Dart.
Fungsinya:
Mengubah setiap elemen menjadi bentuk lain.
Misalnya:
var names = {
'john',
'mark',
'alex'
};
Kita ingin semuanya menjadi huruf besar.
var upperCaseNames = names
.map((name) => name.toUpperCase())
.toSet();
Hasil:
{JOHN, MARK, ALEX}
Apakah names berubah?
Tidak.
print(names);
Tetap:
{john, mark, alex}
Sedangkan:
print(upperCaseNames);
menjadi:
{JOHN, MARK, ALEX}
Jadi map() menghasilkan collection baru.
18. where() vs map()
Ini sering membingungkan pemula.
where()
Digunakan untuk memilih/filter data.
Misalnya:
{sam, john, mark, alex}
Ambil yang mengandung a:
{sam, mark, alex}
map()
Digunakan untuk mengubah setiap data.
Misalnya:
{sam, john, mark}
Ubah menjadi uppercase:
{SAM, JOHN, MARK}
Jadi:
where= pilihmap= ubah
19. union()
Sekarang masuk ke operasi matematika pada Set.
union() berarti gabungan.
Misalnya:
var fruit1 = {'mango', 'apple', 'lemon'};
var fruit2 = {'mango', 'apple', 'grapes', 'kiwi'};
var result = fruit1.union(fruit2);
Gabung semuanya:
mango
apple
lemon
grapes
kiwi
Hasil:
{mango, apple, lemon, grapes, kiwi}
Perhatikan:
mango ada di dua Set, tetapi hasilnya hanya satu.
Karena:
Set tidak menyimpan duplicate.
20. intersection()
intersection() berarti:
Ambil data yang sama-sama terdapat di kedua Set.
Contoh:
var fruit1 = {'mango', 'apple', 'lemon'};
var fruit2 = {'mango', 'apple', 'grapes', 'kiwi'};
var result = fruit1.intersection(fruit2);
Yang ada di keduanya:
mango
apple
Maka:
{mango, apple}
21. difference()
difference() berarti:
Ambil elemen dari Set pertama yang tidak terdapat di Set kedua.
Contoh:
var fruit1 = {'mango', 'apple', 'lemon', 'cherry'};
var fruit2 = {'mango', 'apple', 'grapes', 'kiwi'};
var result = fruit1.difference(fruit2);
Kita lihat fruit1:
mango → ada di fruit2 → buang
apple → ada di fruit2 → buang
lemon → tidak ada → ambil
cherry → tidak ada → ambil
Hasil:
{lemon, cherry}
Kalau dibalik:
var result = fruit2.difference(fruit1);
Maka hasilnya:
{grapes, kiwi}
Karena grapes dan kiwi ada di fruit2, tetapi tidak ada di fruit1.
Cara mengingat:
A.union(B)
= semua yang ada di A atau B
A.intersection(B)
= yang ada di A dan B
A.difference(B)
= yang ada di A tetapi tidak ada di B
22. reduce()
Sekarang kita masuk ke method yang menghasilkan satu nilai dari seluruh isi Set.
Misalnya:
var numbers = {10, 20, 30, 40};
Kita ingin menghitung total:
10 + 20 + 30 + 40 = 100
Kita bisa menggunakan:
var total = numbers.reduce(
(value, next) => value + next
);
print(total);
Hasil:
100
Cara kerja reduce()
Bayangkan Dart melakukan proses seperti:
10 + 20 = 30
30 + 30 = 60
60 + 40 = 100
Akhirnya satu nilai:
100
Perhatian: reduce() membutuhkan Set yang tidak kosong
Karena reduce() menggunakan elemen pertama sebagai nilai awal, collection kosong dapat menyebabkan error.
Kalau:
var numbers = <int>{};
numbers.reduce((a, b) => a + b);
ini bermasalah.
23. fold()
fold() mirip dengan reduce(), tetapi mempunyai satu kelebihan:
Kita bisa menentukan nilai awal sendiri.
Contoh:
var numbers = {10, 20, 30, 40};
var total = numbers.fold(
0,
(value, next) => value + next
);
print(total);
Hasil:
100
Karena mulai dari:
0
Kemudian:
0 + 10 + 20 + 30 + 40 = 100
Bagaimana kalau nilai awalnya 5?
var total = numbers.fold(
5,
(value, next) => value + next
);
Maka:
5 + 10 + 20 + 30 + 40
hasil:
105
24. Perbedaan reduce() dan fold()
Ini penting untuk dipahami.
reduce() | fold() |
|---|---|
| Tidak punya initial value | Punya initial value |
| Elemen pertama menjadi awal | Kita menentukan nilai awal |
| Tipe hasil pada dasarnya mengikuti tipe elemen | Hasil bisa berbeda tipe |
| Bermasalah jika collection kosong | Bisa bekerja dengan collection kosong jika initial value sesuai |
Contoh menarik:
var numbers = {10, 20, 30};
Dengan reduce():
var result = numbers.reduce((a, b) => a + b);
Hasilnya int.
Sedangkan fold() bisa digunakan untuk menghasilkan tipe lain, tergantung operasi dan initial value.
25. toList() dan toSet()
Dart memiliki Iterable, dan banyak method seperti:
where()
map()
menghasilkan Iterable.
Kita bisa mengubahnya menjadi List:
var list = values.toList();
atau menjadi Set:
var set = values.toSet();
Contoh
var values = [10, 20, 30, 40];
var mySet = values.toSet();
var myList = values.toList();
Hasil:
mySet → {10, 20, 30, 40}
myList → [10, 20, 30, 40]
Perhatikan tanda kurungnya:
Set → {}
List → []
26. every()
every() digunakan untuk mengecek:
Apakah SEMUA elemen memenuhi kondisi?
Misalnya:
var fruits = {
'mango',
'pineapple',
'lemon',
'banana',
'orange'
};
Kita ingin mengecek apakah semua buah memiliki huruf "n".
var result = fruits.every(
(fruit) => fruit.contains('n')
);
Mari kita cek:
mango → ada n ✅
pineapple → ada n? ❌
Maka hasilnya:
false
Karena tidak semuanya memenuhi kondisi.
27. any()
any() hampir sama dengan every(), tetapi pertanyaannya berbeda.
every()
“Apakah SEMUA memenuhi kondisi?”
any()
“Apakah ADA MINIMAL SATU yang memenuhi kondisi?”
Contoh:
var fruits = {
'mango',
'apple',
'lemon',
'banana',
'orange'
};
var result = fruits.any(
(fruit) => fruit.contains('o')
);
Ada buah yang memiliki "o"?
Ya:
mango
orange
Jadi:
true
28. Perbedaan every() dan any()
Ini wajib diingat.
| Method | Kondisi |
|---|---|
every() | Semua harus memenuhi |
any() | Minimal satu memenuhi |
Contoh:
{2, 4, 6, 8}
Cek semua angka genap:
numbers.every((n) => n.isEven);
Hasil:
true
Cek apakah ada angka lebih besar dari 7:
numbers.any((n) => n > 7);
Hasil:
true
29. Gambaran besar semua method
Sekarang kita kelompokkan supaya lebih mudah mengingatnya.
Menambah data
add()
addAll()
Menghapus data
remove()
removeAll()
removeWhere()
clear()
Mempertahankan data
retainWhere()
retainAll()
Mengecek data
contains()
containsAll()
lookup()
Mengambil/filter data
where()
whereType()
Mengubah data
map()
Operasi Set
union()
intersection()
difference()
Perhitungan
reduce()
fold()
Konversi
toList()
toSet()
Mengecek kondisi
every()
any()
Akses berdasarkan posisi iterasi
elementAt()
30. Contoh program lengkap
Misalnya kita mempunyai data nilai siswa:
var scores = {80, 90, 75, 90, 100};
Perhatikan bahwa 90 hanya akan muncul sekali.
print(scores);
Hasil:
{80, 90, 75, 100}
Jumlah siswa/nilai
print(scores.length);
Apakah ada nilai 100?
print(scores.contains(100));
Hasil:
true
Ambil nilai yang >= 80
var goodScores = scores
.where((score) => score >= 80)
.toSet();
print(goodScores);
Hasil:
{80, 90, 100}
Naikkan semua nilai 5 poin
var newScores = scores
.map((score) => score + 5)
.toSet();
print(newScores);
Hasil:
{85, 95, 80, 105}
scores asli tidak berubah.
Hitung total
var total = scores.reduce(
(a, b) => a + b
);
print(total);
31. Satu hal yang sangat penting: method-method ini sering tidak mengubah data asli
Ini konsep yang harus benar-benar dipahami.
Misalnya:
var names = {'john', 'mark', 'alex'};
var upperNames = names
.map((name) => name.toUpperCase())
.toSet();
names tetap:
{john, mark, alex}
upperNames:
{JOHN, MARK, ALEX}
Begitu juga:
var filtered = names
.where((name) => name.contains('a'))
.toSet();
where() membuat hasil berdasarkan data asli, bukan menghapus data dari names.
Ini berbeda dengan:
names.removeWhere(...);
Karena removeWhere() memang mengubah Set asli.
Jadi kita bisa membagi:
Method yang memodifikasi Set asli
add
addAll
remove
removeAll
removeWhere
retainWhere
retainAll
clear
Method yang menghasilkan hasil baru
where
whereType
map
union
intersection
difference
Ini bukan daftar mutlak untuk semua nuansa implementasi API, tetapi sangat membantu sebagai mental model pemula.
32. Analogi sederhana agar mudah diingat
Bayangkan Set sebagai kotak koleksi buah.
🍎 Apple
🥭 Mango
🍊 Orange
🍋 Lemon
add()
Masukkan satu buah ke kotak.
addAll()
Masukkan semua buah dari kotak lain.
remove()
Buang satu buah tertentu.
removeAll()
Buang semua buah yang juga ada di kotak lain.
clear()
Kosongkan kotak.
removeWhere()
Buang buah yang memenuhi aturan tertentu.
retainWhere()
Pertahankan buah yang memenuhi aturan tertentu, buang sisanya.
contains()
“Apakah kotak ini punya apel?”
where()
“Ambil semua buah yang memenuhi aturan.”
map()
“Ubah setiap buah/data menjadi bentuk baru.”
union()
Gabungkan dua kotak.
intersection()
Ambil isi yang sama dari dua kotak.
difference()
Ambil isi kotak A yang tidak ada di kotak B.
every()
“Apakah SEMUA buah memenuhi aturan?”
any()
“Apakah ADA SATU saja yang memenuhi aturan?”
33. Cheat sheet paling penting
Kalau baru belajar Dart, tidak perlu langsung menghafal semuanya. Hafalkan kelompok berikut dulu:
// Tambah
set.add(value);
set.addAll(otherSet);
// Hapus
set.remove(value);
set.removeWhere((value) => condition);
set.clear();
// Cek
set.contains(value);
set.containsAll(otherSet);
// Filter
set.where((value) => condition);
// Ubah
set.map((value) => something);
// Operasi Set
set.union(otherSet);
set.intersection(otherSet);
set.difference(otherSet);
// Konversi
iterable.toList();
iterable.toSet();
// Kondisi
set.every((value) => condition);
set.any((value) => condition);
// Perhitungan
set.reduce((a, b) => a + b);
set.fold(initialValue, (a, b) => ...);
Inti video ini
Kalau diringkas menjadi satu kalimat per method:
add→ tambah satu dataaddAll→ tambah banyak dataremove→ hapus satu dataremoveAll→ hapus data yang ada di collection lainclear→ hapus semuanyaremoveWhere→ hapus berdasarkan kondisiretainWhere→ simpan berdasarkan kondisiretainAll→ hanya simpan data yang ada di collection lainelementAt→ mengambil data berdasarkan posisi iterasicontains→ apakah data ini ada?containsAll→ apakah semua data ini ada?lookup→ cari data; kembalikan datanya ataunullwhere→ filter datawhereType→ filter berdasarkan tipemap→ transformasi setiap dataunion→ gabungkan dua Setintersection→ ambil data yang samadifference→ ambil data yang hanya ada di Set pertamareduce→ gabungkan semua data menjadi satu nilaifold→ seperti reduce, tetapi punya nilai awaltoList→ ubah menjadi ListtoSet→ ubah menjadi Setevery→ apakah semuanya memenuhi kondisi?any→ apakah minimal satu memenuhi kondisi?
Yang paling penting untuk level pemula adalah memahami perbedaan where, map, removeWhere, every, any, contains, union, intersection, dan difference. Kalau bagian ini sudah jelas, sebagian besar method Set yang dibahas di video akan terasa jauh lebih mudah.