EMZETT.
Login

Lambda

Kurz: Eine kompakte, namenlose Funktion (seit Java 8) — ersetzt in vielen Fällen eine ausführliche Anonymous Class, wenn nur eine einzige Methode implementiert werden muss.

Genauer: Syntax: (parameter) -> ausdruck bzw. (parameter) -> { anweisungen }. Funktioniert nur mit “funktionalen Interfaces” (Interfaces mit genau einer abstrakten Methode, z. B. Runnable, Comparator). Häufig kombiniert mit der Streams-API, um Collections kompakt zu filtern, transformieren oder sortieren.

liste.forEach(element -> System.out.println(element));

Im Detail

@FunctionalInterface // optional, aber empfohlen - lässt den Compiler prüfen: genau 1 abstrakte Methode
interface Rechner {
    int berechne(int a, int b);
}
 
Rechner addieren = (a, b) -> a + b;
Rechner multiplizieren = (a, b) -> a * b;
System.out.println(addieren.berechne(3, 4)); // 7
 
// Sehr häufig kombiniert mit der Streams-API
List<Integer> zahlen = List.of(1, 2, 3, 4, 5, 6);
List<Integer> geradeQuadrate = zahlen.stream()
    .filter(n -> n % 2 == 0)      // Lambda: welche Zahlen behalten
    .map(n -> n * n)              // Lambda: wie umwandeln
    .collect(Collectors.toList());
System.out.println(geradeQuadrate); // [4, 16, 36]
 
// Method Reference - noch kompakter, wenn das Lambda nur eine bestehende Methode aufruft
zahlen.forEach(System.out::println); // statt zahlen.forEach(n -> System.out.println(n))

Ein Lambda “erbt” den Typ automatisch aus dem Kontext, in dem es verwendet wird (funktionales Interface als Ziel) — es hat selbst keinen eigenen, explizit genannten Typ im Code. Die Kombination aus filter/map/collect auf der Streams-API ist der mit Abstand häufigste praktische Einsatzort für Lambdas in modernem Java-Code: sie ersetzt klassische Schleifen mit manuellem Sammeln in eine neue Liste durch eine deklarative Verkettung von Transformationsschritten, die oft deutlich kompakter und weniger fehleranfällig ist als die entsprechende Schleifen-Version.

Siehe auch: Anonymous Classes, Interface, Sorting