Lektionen des Moduls (1/2)
Lambda-Ausdrücke
Seit Java 8 wird die funktionale Programmierung durch Lambda-Ausdrücke unterstützt. Ein Lambda-Ausdruck ist im Wesentlichen eine anonyme Methode (eine Funktion ohne Namen), die als Argument an Methoden übergeben oder in Variablen gespeichert werden kann.
Funktionale Interfaces
Ein Lambda-Ausdruck kann nur dort verwendet werden, wo ein funktionales Interface (Functional Interface) erforderlich ist. Dies ist ein Interface, das genau eine abstrakte Methode deklariert. Java kennzeichnet diese Interfaces mit der optionalen Annotation @FunctionalInterface.
Beispiel für ein benutzerdefiniertes funktionales Interface:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
Vor Java 8 hätten wir eine anonyme Klasse definieren müssen. Mit Lambdas verkürzt sich die Syntax auf:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Ritorna 8
Struktur von Lambda-Ausdrücken
Die grundlegende Syntax eines Lambdas ist:
(parametri) -> { corpo }
- Ohne Parameter:
() -> System.out.println("Hello") - Einzelner Parameter:
x -> x * 2(runde Klammern können weggelassen werden) - Mehrere Parameter:
(x, y) -> x + y - Mehrzeiliger Rumpf: Wenn der Rumpf mehrere Anweisungen enthält, sind geschweifte Klammern
{}und ein explizitesreturnerforderlich.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Somma in corso...");
return a + b;
};
Standard-Funktionsinterfaces in Java
Das Paket java.util.function stellt viele vordefinierte funktionale Interfaces bereit:
Predicate<T>: Akzeptiert ein Argument vom TypTund gibt einen booleschen Wert zurück (Methodetest(T t)).Consumer<T>: Akzeptiert ein Argument vom TypTund führt eine Operation aus, ohne etwas zurückzugeben (Methodeaccept(T t)).Function<T, R>: Akzeptiert ein Argument vom TypTund gibt ein Ergebnis vom TypRzurück (Methodeapply(T t)).Supplier<T>: Akzeptiert keine Argumente und gibt einen Wert vom TypTzurück (Methodeget()).
Probiere es aus
Vervollständigen Sie den Code, indem Sie das Calculator-Interface über einen Lambda-Ausdruck instanziieren, der zwei Ganzzahlen addiert. Rufen Sie anschließend die Methode calculate auf, übergeben Sie 5 und 3 und geben Sie das Ergebnis auf dem Bildschirm aus.
Hinweis anzeigen
Deklarieren Sie `Calculator adder = (a, b) -> a + b;` und rufen Sie dann `adder.calculate(5, 3)` in der Ausgabe auf.
Lösung nach 3 Versuchen verfügbar
Erstellen Sie eine Instanz des Standard-Funktionsinterfaces Predicate<String> namens isLong mit einem Lambda, das prüft, ob die Länge des Strings größer als 5 Zeichen ist. Geben Sie anschließend das Testergebnis für den String 'hello world' aus.
Hinweis anzeigen
Das Lambda für ein `Predicate<String>` nimmt einen Parameter `s` und gibt `s.length() > 5` als boolesche Bedingung zurück.
Lösung nach 3 Versuchen verfügbar
Sortieren Sie die String-Liste names alphabetisch, indem Sie die Methode sort() aufrufen und einen Lambda-Comparator übergeben (der zwei Strings s1 und s2 annimmt und sie mittels compareTo vergleicht).
Hinweis anzeigen
Verwenden Sie `names.sort((s1, s2) -> s1.compareTo(s2));`, um die Liste an Ort und Stelle zu sortieren.
Lösung nach 3 Versuchen verfügbar