Kriteria penyaringan daftar belanja berubah-ubah: hari ini kita mencari item ber-kg, besok item berhuruf tertentu. Menulis method terpisah untuk setiap kriteria membuat kode membengkak. Lambda expression memecahkan masalah itu dengan menyatakan logika sebaris langsung di tempat penugasan, dan bab ini membedah anatomi sintaksnya secara rinci.
Lambda bukan tipe baru: compiler mengubahnya menjadi instance delegate atau pohon ekspresi, tergantung tipe target penugasannya. Karena itu, seluruh aturan delegate dari section Delegates dan Events tetap berlaku, termasuk keharusan cocoknya signature. Yang berubah hanyalah cara kita menuliskan isi fungsi kecil tersebut. Semakin ringkas penulisannya, semakin sering logika kecil ditulis di dekat pemakaiannya, dan itulah keunggulan praktis yang ditawarkan lambda dibanding method pembantu terpisah.
Anatomi Sintaks Lambda #
Sebuah lambda terdiri dari tiga bagian: daftar parameter, panah =>, dan body. Panah dibaca “menuju”, sehingga item => item.Length dibaca “dari item menuju panjang item”.
| Bentuk | Contoh | Keterangan |
|---|---|---|
| Tanpa parameter | () => "siap" | untuk delegate tanpa argumen |
| Satu parameter | x => x * 2 | tanda kurung boleh dilepas |
| Banyak parameter | (a, b) => a + b | tanda kurung wajib |
| Tipe eksplisit | (string s) => s.Length | membantu compiler dan pembaca |
List<string> belanja = new() { "Beras 5 kg", "Gula 1 kg", "Telur" };
Action<string> cetak = item => Console.WriteLine($"Belanja: {item}");
Predicate<string> berkg = item => item.Contains("kg");
foreach (string item in belanja)
{
if (berkg(item))
{
cetak(item);
}
}Output yang Dihasilkan:
Belanja: Beras 5 kg
Belanja: Gula 1 kgBedah Kode Baris per Baris #
Mari kita telaah kode di atas:
- Baris 3: Lambda
item => Console.WriteLine(...)ditugaskan keAction<string>. Compiler menyimpulkanitembertipestringdari tipe variabel target. - Baris 4: Lambda kedua ditugaskan ke
Predicate<string>, sehingga body-nya wajib bernilaibool. Ekspresiitem.Contains("kg")memenuhi syarat itu. - Baris 6-12: Loop menguji setiap item dengan
berkg, lalu mencetak item yang lolos lewatcetak. ItemTelurtidak mengandung “kg” dan tidak tercetak.
Pada baris berkg, tanda kurung parameter dilepas karena lambda hanya punya satu parameter tanpa tipe eksplisit. Begitu tipe dituliskan atau parameter menjadi dua, kurung wajib kembali, misalnya (string item) => item.Contains("kg") atau (a, b) => a + b.