dartfungsicallbackMenengah4 mnt baca

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

dart
// 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:

dart
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:

dart
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:

dart
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

dart
// SALAH: arrow hanya untuk SATU ekspresi
// int hitung(int a) => {
//   var x = a * 2;
//   return x;
// };
dart
// BENAR: banyak statement pakai blok biasa
int hitung(int a) {
  var x = a * 2;
  return x + 1;
}

2. Menaruh titik koma di dalam arrow

dart
// SALAH
// int tambah(int a, int b) => a + b;; // titik koma ganda
dart
// BENAR: satu titik koma di akhir
int tambah(int a, int b) => a + b;

3. Bingung kapan perlu nama

dart
// 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!
}
dart
// 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 if bertingkat 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.

text
// TODO: fungsi proses

void main() {
  // TODO: uji dengan (n) => n * 3 dan (n) => n + 10
}