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:
@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:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Structuur van Lambda-expressies
De basissyntaxis van een lambda is:
(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 instructiereturnvereist.
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 typeTen retourneert een booleaanse waarde (methodetest(T t)).Consumer<T>: accepteert een argument van het typeTen voert een bewerking uit zonder een resultaat terug te geven (methodeaccept(T t)).Function<T, R>: accepteert een argumentTen retourneert een resultaatR(apply(T t)methode).Supplier<T>: accepteert geen argumenten en retourneert een waarde van het typeT(methodeget()).
Probeer het zelf
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.
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
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'.
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
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).
Toon hint
Gebruik `names.sort((s1, s2) -> s1.compareTo(s2));` om de lijst op zijn plaats te sorteren.
Oplossing beschikbaar na 3 pogingen