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) => expressieof
(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 hebbenCodevoorbeeld 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: 25Hieronder een voorbeeld met drie generic typen:
Func - Meerdere parameters
Func<int, int, int> optellen = (a, b) => a + b;
Console.WriteLine(optellen(3, 7)); // Output: 10Codevoorbeeld 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: TrueSamenvatting syntax lambda expressies
In de tabel zijn is de mogelijke syntax van lambda expressies opgenomen.
| Omschrijving | Parameter | Expressie/statement |
|---|---|---|
| Implicitly typed | x | x => x + 1 |
| Statement body | x | x => { 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.
| Naam | Parameter(s) | Return type |
|---|---|---|
Action | 0 | void |
Action<T> | 1..16 | void |
Func<T> | 0 | T |
Func<T1, TResult> | 1..16 | TResult |
Predicate<T> | 1 | bool |
Volgende stap: Oefeningen lambda expressies
