Wat is een Lambda expressie?

Voordat we ingaan op wat lambda expressies zijn, hebben een ander begrip nodig: anonieme functies.

Anonieme functie

Een anonieme functie is een functie die geen naam heeft en direct wordt gebruikt op de plek waar deze wordt gedefinieerd. In C# kunnen anonieme functies worden gemaakt met het delegate-keyword of met lambda-expressies.

Lambda expressie

Een lambda expressie in C# is een compacte manier om anonieme functies te definiëren. Een lambda expressie is een anonieme functie. Dus ook een lambda expressie heeft geen naam. De lambda expressie maakt gebruik van de lambda operator =>.

Hoe zit een lambda expressie in elkaar?

Eerst een korte toelichting op de structuur van een anonieme functie. Een anonieme functie gebruikt het keyword delegate om de signatuur van de functie te typeren. In het onderstaande voorbeeld wordt de functie Bereken getypeerd met een delegate.

Codevoorbeeld anonieme functie

// Delegate type definiëren
delegate int Bereken(int x);
 
class Program
{
    static void Main()
    {
        // Anonieme functie zonder lambda
        Bereken kwadraat = delegate(int x) { return x * x; };
 
        Console.WriteLine(kwadraat(5)); // Output: 25
    }
}  

Basis syntax lambda expressie

Een lambda expressie heeft altijd een typering nodig. Dit kan door het keyword delegate. Maar er zijn alternatieven in C# ingebouwd: Func, Action, Predicate.

De basis is deze syntax:

(parameters) => expressie

of

(parameters) => { statements }

Maar onderstaande werkt dus niet, omdat de typering onbreekt:

// Dit werkt niet direct, want de lambda heeft een type nodig
var resultaat = (x => x * x)(5); // FOUT: Lambda moet een type hebben

Codevoorbeeld syntax lambda expressie

In het codevoorbeeld hieronder is de anonieme functie als een lambda expressie geschreven.

// Delegate type definiëren
delegate int Bereken(int x);
 
class Program
{
    static void Main()
    {
        // Anonieme functie zonder lambda
        Bereken kwadraat = (int x) => { return x * x; };
 
        Console.WriteLine(kwadraat(5)); // Output: 25
    }
}  

In het codevoorbeeld hieronder is de delegate typering vervangen voor een Func. Het gebruik van delegate is overbodig geworden, want Func is een delegate.

Codevoorbeeld lambda expressie met Func

In het codevoorbeeld bevat de Func twee generic typen: <int, int>. De betekenis hiervan is: het laatste type staat voor het return type. De typen voor het return type beschrijven de typen van de parameters van de functie.

Func<int, int> kwadraat = x => x * x;
Console.WriteLine(kwadraat(5)); // Output: 25

Hieronder een voorbeeld met drie generic typen:

Func - Meerdere parameters

Func<int, int, int> optellen = (a, b) => a + b;
Console.WriteLine(optellen(3, 7)); // Output: 10

Codevoorbeeld lamda expressie met Action

Een Action in C# is een ingebouwde delegate die een methode vertegenwoordigt die geen waarde retourneert (void).

Action<string> zegHallo = naam => Console.WriteLine($"Hallo, {naam}!");
zegHallo("Alice"); // Output: Hallo, Alice!

Codevoorbeeld lambda expressie met Predicate

Een Predicate in C# is een ingebouwde delegate die een waarde accepteert en een bool retourneert. Het wordt vaak gebruikt om te controleren of een object aan een bepaalde voorwaarde voldoet.

Een Predicate<T> is een ingebouwde delegate in C# die de volgende vorm heeft:

Predicate<int> isEven = n => n % 2 == 0;
Console.WriteLine(isEven(4)); // Output: True

Samenvatting syntax lambda expressies

In de tabel zijn is de mogelijke syntax van lambda expressies opgenomen.

OmschrijvingParameterExpressie/statement
Implicitly typedxx => x + 1
Statement bodyxx => { return x + 1; }
Formal parameters + expression body(int x)x => x + 1
Formal parameters + statement body(int x){ return x + 1; }
Multiple parameters(x, y)x * y
No parameters()() => Console.WriteLine()

Samenvatting ingebouwde delegates

In de tabel een samenvatting van de ingebouwde delegates en hun mogelijke parameters en return typen.

NaamParameter(s)Return type
Action0void
Action<T>1..16void
Func<T>0T
Func<T1, TResult>1..16TResult
Predicate<T>1bool

Volgende stap: Oefeningen lambda expressies