Direct naar de hoofdinhoud
Module 7 · Les 1 van 213/14 in de cursus~12 min
Modulelessen (1/2)

Lambda-uitdrukkingen

Vanaf Java 8 wordt functioneel programmeren ondersteund via Lambda Expressions. Een lambda-expressie is in wezen een anonieme methode (een functie zonder naam) die als argument aan methoden kan worden doorgegeven of in variabelen kan worden opgeslagen.

Functionele interfaces

Een lambda-expressie kan alleen worden gebruikt als een Functionele Interface vereist is. Een functionele interface is een interface die precies één abstracte methode declareert. Java markeert deze interfaces met de optionele annotatie @FunctionalInterface.

Voorbeeld van een door de gebruiker gedefinieerde functionele interface:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

Vóór Java 8 moest je een anonieme innerlijke klasse definiëren. Met lambdas wordt de syntaxis vereenvoudigd tot:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Structuur van Lambda-expressies

De basissyntaxis van een lambda is:

Code
(parameters) -> { body }
  • Zonder parameters: () -> System.out.println("Hello")
  • Enkele parameter: x -> x * 2 (haakjes kunnen worden weggelaten)
  • Meerdere parameters: (x, y) -> x + y
  • Hoofdtekst van meerdere regels: als de hoofdtekst meerdere instructies bevat, zijn accolades {} en een expliciete instructie return vereist.
Java
MathOperation detailedAddition = (a, b) -> {
    System.out.println("Adding...");
    return a + b;
};

Standaard functionele interfaces in Java

Het java.util.function pakket biedt verschillende ingebouwde functionele interfaces:

  • Predicate<T>: accepteert een argument van het type T en retourneert een booleaanse waarde (methode test(T t)).
  • Consumer<T>: accepteert een argument van het type T en voert een bewerking uit zonder een resultaat terug te geven (methode accept(T t)).
  • Function<T, R>: accepteert een argument T en retourneert een resultaat R (apply(T t) methode).
  • Supplier<T>: accepteert geen argumenten en retourneert een waarde van het type T (methode get()).

Probeer het zelf

Oefening#java.m7.l1.e1
Pogingen: 0Laden…

Voltooi de code door de Calculator-interface te instantiëren met behulp van een lambda-expressie die twee gehele getallen optelt. Roep vervolgens de berekeningsmethode aan, waarbij u 5 en 3 doorgeeft, en druk het resultaat af.

Editor laden…
Toon hint

Declareer `Calculator adder = (a, b) -> a + b;` en roep vervolgens `adder.calculate(5, 3)` aan binnen de printaanroep.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m7.l1.e2
Pogingen: 0Laden…

Maak een exemplaar van de standaard functionele interface Predicate<String> met de naam isLong, met behulp van een lambda-expressie die controleert of de tekenreekslengte groter is dan 5 tekens. Print vervolgens het testresultaat voor 'Hallo wereld'.

Editor laden…
Toon hint

De lambda voor een `Predicate<String>` neemt een parameter `s` en retourneert `s.length() > 5` als een Booleaanse voorwaarde.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m7.l1.e3
Pogingen: 0Laden…

Sorteer de lijst met namen van tekenreeksen alfabetisch door de methode sort() erop aan te roepen en een lambda-expressie door te geven die Comparator implementeert (twee tekenreeksen s1, s2 nemen en deze vergelijken met behulp van CompareTo).

Editor laden…
Toon hint

Gebruik `names.sort((s1, s2) -> s1.compareTo(s2));` om de lijst op zijn plaats te sorteren.

Oplossing beschikbaar na 3 pogingen