📍 Collections
1. List
List sesuai namanya dapat menampung banyak data ke dalam satu objek. Dalam kehidupan sehari-hari kita menggunakan list untuk menyimpan daftar belanja, nomor telepon, dsb. Begitu pula dengan Dart kita bisa menyimpan bermacam-macam tipe data seperti string, number, dan boolean. Cara penulisannya pun sangat mudah. Perhatikan saja contoh berikut:
List<int> numberList = [1, 2, 3, 4, 5];
Kode di atas adalah contoh dari satu objek List yang berisi kumpulan data dengan tipe integer. Karena kompiler bisa mengetahui tipe data yang ada dalam sebuah objek List, maka tak perlu kita menuliskannya secara eksplisit.
var numberList = [1, 2, 3, 4, 5];
var stringList = ['Hello', 'WRI', 'Dart'];
Sesuai contoh di atas, kita mendefinisikan tipe data yang bisa dimasukkan ke dalam List di dalam tanda kurung siku ([ ]
). Sama seperti variabel, jika kita tidak mendefinisikan nilai secara eksplisit ke dalam List, maka List akan menyimpan tipe dynamic atau bisa menyimpan semua tipe data.
void main() {
List dynamicList = [1, 'WRI', true];
print(dynamicList.runtimeType);
}
/// Output:
/// List<dynamic>
Ketika bermain dengan sebuah List, tentunya ada saat di mana kita ingin mengakses posisi tertentu dari List tersebut. Untuk melakukannya, kita bisa menggunakan fungsi indexing seperti berikut:
void main() {
List dynamicList = [1, 'WRI', true];
print(dynamicList[1]);
}
// Output: WRI
Perhatikan kode di atas. Fungsi indexing ditandai dengan tanda [ ]
. Jika Anda mengira bahwa konsol akan menampilkan angka 1, tebakan Anda kurang tepat. Dalam sebuah List, indeks dimulai dari 0. Maka ketika kita akan mengakses data pada dynamicList
yang berada pada indeks ke-1, artinya data tersebut merupakan data pada posisi ke-2. Jadi data yang akan ditampilkan pada konsol adalah WRI.
Lalu apa yang akan terjadi jika kita berusaha menampilkan item dari List yang berada di luar dari ukuran List tersebut? Sebagai contoh, Anda ingin mengakses indeks ke-3 dari dynamicList
:
print(dynamicList[3]);
Hasilnya adalah eror! Kompiler akan memberitahukan bahwa perintah itu tidak bisa dijalankan. Berikut pesan eror yang akan muncul:
Unhandled exception:RangeError (index): Invalid value: Not in range 0..2, inclusive: 3
Pesan di atas memberitahu kita bahwa List telah diakses dengan indeks ilegal. Ini akan terjadi jika indeks yang kita inginkan negatif atau lebih besar dari atau sama dengan ukuran List tersebut.
Masih ingat looping? Untuk menampilkan seluruh item dari list kita bisa memanfaatkan looping. Contohnya perhatikan kode berikut:
void main() {
List<String> stringList = ["Hello", "WRI", "Dart"];
for (int i = 0; i < stringList.length; i++) {
print(stringList[i]);
}
}
// Output:
// Hello
// WRI
// Dart
Pada kode di atas kita memanfaatkan perulangan sebanyak jumlah data di dalam list untuk mencetak data yang ada di dalam list. Banyaknya data di dalam list bisa kita panggil melalui properti .length
.
Selain itu kita juga bisa menggunakan fungsi foreach
untuk menampilkan data di dalam list.
void main() {
List<String> stringList = ["Hello", "WRI", "Dart"];
stringList.forEach((s) => print(s));
}
Mekanisme di atas dikenal sebagai lambda atau anonymous function. Kita akan mempelajarinya lebih dalam pada modul yang akan datang.
Sejauh ini kita baru belajar menginisialisasikan dan mengakses data dari sebuah List. Pastinya Anda bertanya, “Bagaimana kita memanipulasi data pada List tersebut?” Nah, untuk menambahkan data ke dalam list, kita bisa menggunakan fungsi add()
.
void main() {
List<String> stringList = ["Hello", "WRI", "Dart"];
// Menambahkan data di akhir list.
stringList.add('Flutter');
print(stringList);
}
/// Output:
/// [Hello, WRI, Dart, Flutter]
Lalu bagaimana jika kita ingin menambahkan data namun tidak di akhir List? Jawabannya adalah dengan fungsi insert
. Di dalam fungsi insert kita perlu memasukkan 2 parameter, yaitu indeks list dan data yang akan dimasukkan.
void main() {
List<String> stringList = ["Hello", "WRI", "Dart", "Flutter"];
// Menambahkan data di indeks ke-0.
stringList.insert(0, 'Programming');
print(stringList);
}
/// Output:
/// [Programming, Hello, WRI, Dart, Flutter]
Untuk mengubah nilai di dalam list, kita bisa langsung menginisialisasikan nilai baru sesuai indeks yang diinginkan.
stringList[1] = 'Application';
Sedangkan untuk menghapus data terdapat beberapa fungsi remove yang bisa kita gunakan, antara lain:
void main() {
List<String> stringList = [
"Programming",
"Hello",
"WRI",
"Dart",
"Flutter"
];
// Menghapus list dengan nilai Programming
stringList.remove('Programming');
// Menghapus list pada index ke-1
// stringList.removeAt(1);
// Menghapus data list terakhir
// stringList.removeLast();
// Menghapus list mulai index ke-0 sampai ke-1 (indeks 2 masih dipertahankan)
// stringList.removeRange(0,2);
print(stringList);
}
Spread Operator
Dart memiliki fitur menarik untuk menambahkan banyak nilai ke dalam List dengan cara yang singkat, yaitu spread operator.
Sesuai namanya “spread”, fitur ini digunakan untuk menyebarkan nilai di dalam collections menjadi beberapa elemen. Spread operator dituliskan dengan tiga titik (...
). Mari kita lihat contoh kode berikut:
void main() {
var favorites = ['Seafood', 'Salad', 'Nugget', 'Soup'];
var others = ['Cake', 'Pie', 'Donut'];
var allFavorites = [favorites, others];
print(allFavorites);
}
/// Output:
/// [[Seafood, Salad, Nugget, Soup], [Cake, Pie, Donut]]
Nilai List tidak akan tergabung. Alih-alih menggabungkan nilainya, variabel allFavorites menjadi List yang menampung dua List di dalamnya. Nah, dengan spread operator kita dapat menggabungkan kedua List di atas:
void main() {
var favorites = ['Seafood', 'Salad', 'Nugget', 'Soup'];
var others = ['Cake', 'Pie', 'Donut'];
var allFavorites = [...favorites, ...others];
print(allFavorites);
}
/// Output:
/// [Seafood, Salad, Nugget, Soup, Cake, Pie, Donut]
Yup, dengan spread operator kita dapat memasukkan masing-masing elemen di dalam List ke dalam List lainnya.
Untuk mengatasi List yang bisa bernilai null, kita dapat menggunakan null-aware spread operator (...?
) seperti berikut:
void main() {
List<dynamic>? list;
List<dynamic>? list2 = [0, ...?list];
print(list2);
}
/// Output:
/// [0]
Materi terkait List
2. Set
Selanjutnya kita akan membahas jenis collection yang kedua, yaitu Set. Set merupakan sebuah collection yang hanya dapat menyimpan nilai yang unik. Ini akan berguna ketika Anda tidak ingin ada data yang sama alias duplikasi dalam sebuah collection. Kita bisa mendeklarasikan Set dengan beberapa cara berikut:
void main() {
Set<int> anotherSet = new Set.from([1, 4, 6, 4, 1]);
print(anotherSet);
}
/// Output:
/// {1, 4, 6}
Secara otomatis Set akan membuang angka yang sama, sehingga hasilnya adalah {1, 4, 6}.
Untuk menambahkan data ke dalam Set kita dapat memanfaatkan fungsi add()
atau addAll()
.
void main() {
var numberSet = {1, 4, 6};
// Menambahkan data ke dalam Set.
numberSet.add(6);
numberSet.addAll({2, 2, 3});
print(numberSet);
}
/// Output:
/// {1, 4, 6, 2, 3}
Materi terkait Sets
3. Map
Collection ketiga adalah Map, yakni sebuah collection yang dapat menyimpan data dengan format key-value. Perhatikan contoh berikut:
var capital = {
'Jakarta': 'Indonesia',
'London': 'England',
'Tokyo': 'Japan'
};
String yang berada pada sebelah kiri titik dua (😃 adalah sebuah key, sedangkan yang di sebelah kanan merupakan value-nya. Lalu untuk mengakses nilai dari Map tersebut, kita bisa menggunakan key yang sudah dimasukkan. Misalnya, kita bisa menggunakan key “Jakarta” untuk mendapatkan value “Indonesia”:
void main() {
var capital = {
'Jakarta': 'Indonesia',
'London': 'England',
'Tokyo': 'Japan',
};
print(capital['Jakarta']);
}
/// Output:
/// Indonesia
Kita dapat menampilkan key apa saja yang ada di dalam Map dengan menggunakan property keys
. Sedangkan untuk mengetahui nilai apa saja yang ada di dalam Map kita bisa menggunakan property values
.
void main() {
var capital = {
'Jakarta': 'Indonesia',
'London': 'England',
'Tokyo': 'Japan',
};
var mapKeys = capital.keys;
print("mapKeys: $mapKeys");
var mapValues = capital.values;
print("mapValues: $mapValues");
}
/// Output:
/// mapKeys = (Jakarta, London, Tokyo)
/// mapValues = (Indonesia, England, Japan)
Untuk menambahkan key-value baru ke dalam Map, kita bisa melakukannya dengan cara berikut:
void main() {
var capital = {
'Jakarta': 'Indonesia',
'London': 'England',
'Tokyo': 'Japan',
};
capital['New Delhi'] = 'India';
print(capital);
}
/// Output:
/// {Jakarta: Indonesia, London: England, Tokyo: Japan, New Delhi: India}
Materi terkait Maps