Arrow Function & Fungsi Anonim
Sintaks ringkas => dan fungsi tanpa nama untuk callback.
Fungsi super ringkas
Kadang fungsi hanya berisi satu baris: int tambah(int a, int b) { return a + b; }. Menulis kurung kurawal dan return untuk satu ekspresi terasa bertele-tele. Arrow function memadatkannya menjadi int tambah(int a, int b) => a + b;.
Analogi: arrow function itu seperti singkatan chat. "Aku akan pergi ke sana" disingkat "OTW". Maknanya sama, penulisannya jauh lebih cepat. Tapi seperti singkatan, hanya cocok untuk hal yang singkat.
Kenapa arrow function ada?
Karena kode Dart modern penuh fungsi satu baris: getter sederhana, callback, transformasi list (.map((x) => x * 2)). Tanpa arrow, kode dipenuhi boilerplate { return ...; } yang mengaburkan logika sebenarnya.
Bentuk dasar
// Versi panjang
int tambahPanjang(int a, int b) {
return a + b;
}
// Versi arrow: => menggantikan { return ...; }
int tambah(int a, int b) => a + b;
void main() {
print(tambahPanjang(2, 3)); // 5
print(tambah(2, 3)); // 5, sama persis
}Aturannya: => ekspresi sama dengan { return ekspresi; }. Ekspresinya hanya boleh SATU, tidak bisa beberapa statement.
Contoh kedua, arrow di berbagai konteks:
String sapa(String nama) => 'Halo, $nama!';
bool isGenap(int n) => n % 2 == 0;
void cetak(int n) => print('Nilai: $n');
void main() {
print(sapa('Budi'));
print(isGenap(4)); // true
print(isGenap(7)); // false
cetak(42);
}Untuk fungsi void, arrow tetap boleh: => print(...) berarti "jalankan ekspresi ini, tidak ada return".
Fungsi anonim: fungsi tanpa nama
Kadang kamu butuh fungsi kecil sekali pakai yang tidak layak diberi nama. Fungsi anonim (anonymous function/lambda) ditulis langsung di tempat pemakaian:
void main() {
var angka = [1, 2, 3, 4];
// Fungsi anonim sebagai argumen: tidak punya nama, langsung dipakai
var genap = angka.where((n) {
return n % 2 == 0;
});
print(genap); // (2, 4)
// Versi arrow anonim, lebih ringkas
var ganjil = angka.where((n) => n % 2 != 0);
print(ganjil); // (1, 3)
}Sintaksnya: (parameter) { badan } atau (parameter) => ekspresi, tanpa nama dan tanpa tipe return di depan. Pola ini akan muncul TERUS di Flutter (callback tombol, builder list) dan di method collection.
Contoh kedua, menyimpan fungsi anonim di variabel:
void main() {
// Variabel berisi fungsi!
var kuadrat = (int n) => n * n;
var sapaHangat = (String nama) {
print('Halo $nama, apa kabar?');
};
print(kuadrat(5)); // 25
sapaHangat('Ani');
}Ini bukti fungsi adalah objek kelas satu di Dart: bisa disimpan, dioper, dipanggil lewat variabel.
Kesalahan umum pemula
1. Memakai arrow untuk banyak statement
// SALAH: arrow hanya untuk SATU ekspresi
// int hitung(int a) => {
// var x = a * 2;
// return x;
// };// BENAR: banyak statement pakai blok biasa
int hitung(int a) {
var x = a * 2;
return x + 1;
}2. Menaruh titik koma di dalam arrow
// SALAH
// int tambah(int a, int b) => a + b;; // titik koma ganda// BENAR: satu titik koma di akhir
int tambah(int a, int b) => a + b;3. Bingung kapan perlu nama
// Kurang tepat: anonim untuk logika yang dipakai ulang
void main() {
var a = [1, 2, 3].where((n) => n > 10).toList();
var b = [4, 5, 6].where((n) => n > 10).toList(); // duplikasi!
}// BENAR: beri nama kalau dipakai lebih dari sekali
bool lebihDariSepuluh(int n) => n > 10;
void main() {
var a = [1, 2, 3].where(lebihDariSepuluh).toList();
var b = [4, 5, 6].where(lebihDariSepuluh).toList();
}Aturan jempol: anonim untuk sekali pakai di tempat, bernama untuk yang dipakai ulang atau logikanya penting.
Kesimpulan
Arrow => untuk fungsi satu ekspresi, fungsi anonim untuk fungsi sekali pakai tanpa nama. Keduanya adalah "bumbu" yang membuat kode Dart modern ringkas, terutama saat berurusan dengan collection dan callback Flutter.
Catatan teknis: Arrow function tidak bisa mengandung statement seperti
ifbertingkat atau loop. Kalau logikanya butuh lebih dari satu ekspresi, itu sinyal untuk memakai blok fungsi biasa, bukan memaksakan arrow.
Tantangan
Operasi dengan callback
Buat fungsi proses(List<int> data, int Function(int) fn) yang menerapkan fn ke tiap elemen dan mengembalikan list baru. Uji dengan fungsi anonim arrow: kali 3 dan tambah 10.
// TODO: fungsi proses
void main() {
// TODO: uji dengan (n) => n * 3 dan (n) => n + 10
}