Direkt zum Hauptinhalt springen
eLearner.app
Modul 7 · Lektion 1 von 213/14 im Kurs~12 min
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:

Code
@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:

Code
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:

Code
(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 explizites return erforderlich.
Code
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 Typ T und gibt einen booleschen Wert zurück (Methode test(T t)).
  • Consumer<T>: Akzeptiert ein Argument vom Typ T und führt eine Operation aus, ohne etwas zurückzugeben (Methode accept(T t)).
  • Function<T, R>: Akzeptiert ein Argument vom Typ T und gibt ein Ergebnis vom Typ R zurück (Methode apply(T t)).
  • Supplier<T>: Akzeptiert keine Argumente und gibt einen Wert vom Typ T zurück (Methode get()).

Probiere es aus

Übung#java.m7.l1.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#java.m7.l1.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#java.m7.l1.e3
Versuche: 0Wird geladen…

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

Editor wird geladen…
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