Tidak semua logika muat dalam satu ekspresi. Pemformatan harga belanja, misalnya, perlu menguji nilai terlebih dahulu, lalu memformat angka menjadi rupiah. Untuk kasus seperti ini, lambda menyediakan bentuk blok: kurawal {} yang menampung beberapa statement dan return eksplisit. Bentuk ini disebut statement lambda.

Statement lambda diproses runtime dengan cara yang sama seperti expression lambda: compiler menghasilkan method privat tersembunyi lalu menugaskannya ke delegate. Perbedaannya murni penulisan: blok kurawal menampung lebih dari satu statement, dan karena itu return wajib ditulis eksplisit. Contoh di bawah memakai CultureInfo, sehingga file perlu using System.Globalization; di bagian atasnya.

Lambda dengan Blok Statement #

csharp
List<int> hargaBarang = new() { 12500, 9900, 45000 };

Func<int, string> formatHarga = nilai =>
{
    if (nilai <= 0)
    {
        return "Harga tidak valid";
    }
    return $"Rp{nilai.ToString("N0", CultureInfo.GetCultureInfo("id-ID"))}";
};

foreach (int nilai in hargaBarang)
{
    Console.WriteLine(formatHarga(nilai));
}

Output yang Dihasilkan:

text
Rp12.500
Rp9.900
Rp45.000

Format N0 dengan culture id-ID memisahkan ribuan memakai titik, sehingga 12500 tampil sebagai 12.500.

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 3: Lambda ditugaskan ke Func<int, string>; body bertipe string karena itu return type delegate.
  2. Baris 4-6: Statement pertama menguji nilai non-positif dan mengembalikan pesan penolakan lebih awal. Pola guard clause ini lazim di dalam blok lambda.
  3. Baris 7: Statement return kedua memformat angka. Karena body memuat lebih dari satu statement, return tidak boleh dilepas.
  4. Baris 10-13: Loop memanggil formatHarga untuk tiga harga; seluruh nilai positif sehingga ketiganya melewati jalur format.

Perhatikan bahwa tiga harga melewati jalur yang sama tanpa satu pun cabang tambahan. Bila nanti ada harga nol atau negatif, guard clause di dalam lambda menangkapnya dan mengembalikan pesan penolakan tanpa melempar exception.