Literal koleksi pada Dart dapat memuat struktur kendali di dalam tubuhnya, yaitu operator spread, collection-if, dan collection-for. Ketiganya menyusun isi koleksi secara deklaratif di dalam literal List, Set, dan Map, sehingga pembentukan koleksi tidak lagi ditulis sebagai rangkaian perintah add yang terpisah. Topik ini membahas ketiga struktur tersebut satu per satu, lengkap dengan contoh penyusunan jadwal piket, baris laporan suhu, dan filter kehadiran.
Operator spread#
Operator spread, ditulis ..., menyisipkan seluruh elemen sebuah iterable ke dalam literal koleksi. Ekspresi [...a, ...b] menghasilkan List baru yang berisi elemen a diikuti elemen b, tanpa mengubah kedua sumbernya. Bentuk ...? adalah versi null-safe-nya, yaitu menyisipkan elemen apabila sumbernya tidak null dan melewatkan sumber yang bernilai null tanpa error. Operator ini sangat berguna ketika sebuah koleksi disusun dari beberapa potongan data yang masing-masing sudah berbentuk koleksi.
Contoh berikut menggabungkan daftar tugas piket pagi dan piket sore menjadi satu jadwal, lalu menunjukkan perilaku ...? terhadap daftar tambahan yang belum diisi.
void main() {
var piketPagi = ['menyapu lantai', 'menyiram tanaman'];
var piketSore = ['membuang sampah'];
var jadwal = [...piketPagi, ...piketSore];
print(jadwal);
List<String>? piketEkstra;
var jadwalLengkap = [...piketPagi, ...?piketEkstra];
print(jadwalLengkap);
}[menyapu lantai, menyiram tanaman, membuang sampah]
[menyapu lantai, menyiram tanaman]Gabungan [...piketPagi, ...piketSore] menyalin elemen dari kedua daftar ke dalam List baru, sehingga perubahan pada jadwal tidak memengaruhi piketPagi maupun piketSore. Variabel piketEkstra dideklarasikan bertipe List<String>? dan belum diisi, sehingga nilainya null. Operator ...? menangani nilai null tersebut dengan melewatkan seluruh sumbernya, sedangkan ... tanpa tanda tanya akan melempar error apabila sumbernya null. Pilihan ini menjadikan spread null-safe berguna untuk data opsional yang mungkin belum tersedia.
Collection-if#
Collection-if menyisipkan satu elemen ke dalam literal hanya apabila kondisinya benar. Bentuknya sama dengan pernyataan if biasa, yaitu if (kondisi) elemen, dan dapat dilengkapi else untuk menyediakan elemen alternatif apabila kondisinya salah. Struktur ini menggantikan pola pernyataan add bersyarat yang tersebar di kode, karena keputusan tentang elemen yang masuk ke koleksi langsung terlihat pada literalnya. Kondisinya dapat berupa ekspresi bool apa pun, termasuk perbandingan dan operator logika seperti && atau ||.
Contoh berikut menyusun daftar tugas piket yang menyertakan pekerjaan tambahan setiap hari Jumat, serta memilih kegiatan berdasarkan kondisi cuaca.
void main() {
var hari = 'Jumat';
var tugas = [
'menyapu lantai',
if (hari == 'Jumat') 'membersihkan papan tulis',
'membuang sampah',
];
print(tugas);
var cuaca = 'hujan';
var kegiatan = [
if (cuaca == 'cerah') 'bermain di halaman' else 'rapat di dalam kelas',
];
print(kegiatan);
}[menyapu lantai, membersihkan papan tulis, membuang sampah]
[rapat di dalam kelas]Elemen membersihkan papan tulis muncul karena nilai hari memang Jumat, sedangkan dua elemen lainnya tetap ditulis apa adanya. Pada literal kedua, cabang else dipilih karena cuaca bukan cerah, sehingga hasilnya adalah List berisi tepat satu elemen. Collection-if dengan else selalu menyumbang tepat satu elemen karena salah satu cabangnya pasti terpilih, sedangkan collection-if tanpa else menyumbang nol atau satu elemen sesuai kondisinya.
Collection-for#
Collection-for mengulangi satu ekspresi elemen di dalam literal, sehingga satu perulangan langsung menghasilkan banyak elemen sekaligus. Bentuknya sama seperti perulangan biasa, yaitu for (var x in kumpulan) ekspresi atau bentuk indeks for (var i = 0; i < n; i++) ekspresi. Setiap iterasi menyumbang satu elemen, dan panjang koleksi akhirnya mengikuti banyaknya iterasi. Varian for-in atas sebuah koleksi juga sah, sehingga setiap elemen dapat disusun tanpa menyebut indeks secara eksplisit. Struktur ini cocok untuk menyusun baris laporan yang jumlahnya ditentukan oleh data, bukan oleh kode.
Contoh berikut membentuk baris laporan dari tiga pembacaan sensor suhu pada pagi hari.
void main() {
var suhuPagi = [24.5, 25.0, 26.5];
var laporan = [
for (var i = 0; i < suhuPagi.length; i++)
'Pagi-$i: ${suhuPagi[i]} derajat',
];
print(laporan);
}[Pagi-0: 24.5 derajat, Pagi-1: 25.0 derajat, Pagi-2: 26.5 derajat]Perulangan berjalan tiga kali karena suhuPagi berisi tiga nilai, dan setiap iterasi menyusun satu baris berformat Pagi-indeks beserta nilai suhunya. Interpolasi ${suhuPagi[i]} menyisipkan nilai pembacaan ke dalam string baris, sehingga laporan langsung siap dicetak. Apabila data bertambah menjadi sepuluh pembacaan, literal yang sama menghasilkan sepuluh baris tanpa perubahan apa pun pada struktur kodenya. Hasil collection-for tetap merupakan koleksi utuh, sehingga length, contains, dan metode koleksi lainnya dapat diterapkan langsung padanya.
Kombinasi di dalam satu literal#
Ketiga struktur tersebut dapat dipadukan dalam satu literal, dan paduan semacam ini sering muncul pada kode nyata. Selain List, struktur kendali dalam literal juga berlaku pada Set dan Map, sehingga penyaringan dan pemetaan dapat ditulis tepat di tempat koleksinya dibangun. Urutan penulisannya bebas, yaitu elemen biasa, spread, collection-if, dan collection-for dapat berselang-seling di dalam satu literal. Kompiler membaca setiap elemen secara berurutan, sehingga hasil akhirnya mudah dilacak baris demi baris.
Contoh berikut menyaring nama peserta yang belum hadir dengan menyatukan collection-for dan collection-if di dalam literal Set.
void main() {
var semuaNama = ['Ali', 'Budi', 'Citra', 'Dewi'];
var sudahHadir = {'Budi', 'Dewi'};
var belumHadir = {
for (var nama in semuaNama)
if (!sudahHadir.contains(nama)) nama,
};
print(belumHadir);
}{Ali, Citra}Literal belumHadir memuat satu collection-for yang berjalan atas semuaNama, dan di dalamnya sebuah collection-if hanya menyumbang nama yang tidak terdapat pada sudahHadir. Hasilnya adalah Set berisi Ali dan Citra, sedangkan Budi serta Dewi tereliminasi karena sudah hadir. Pola seperti ini menggantikan perulangan bersyarat beserta add yang terpisah, sehingga maksud kode terbaca langsung dari literalnya. Literal dengan struktur kendali tetap merupakan satu ekspresi, sehingga hasilnya dapat diisi ke variabel, diteruskan sebagai argumen fungsi, atau langsung dikembalikan.
Ringkasan#
- Operator
...menyisipkan elemen iterable ke dalam literal, sedangkan...?melewatkan sumber yang bernilainull. - Collection-if menyisipkan elemen bersyarat, dengan
elsesebagai alternatif yang selalu menyumbang tepat satu elemen. - Collection-for menghasilkan satu elemen per iterasi, sehingga panjang koleksi mengikuti panjang datanya.
- Ketiga struktur berlaku pada literal List, Set, dan Map dan dapat dipadukan dalam satu literal.
Referensi#
- Collections — dart.dev — Dokumentasi resmi operator spread dan struktur kendali di dalam literal koleksi.
- Control flow — dart.dev
— Pernyataan
ifdanforyang menjadi dasar collection-if dan collection-for. - Effective Dart — dart.dev — Panduan gaya resmi yang menganjurkan penggunaan literal koleksi bila memungkinkan.