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.
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