Lambda: Was ist das, Syntax und Verwendung in Kotlin

Autor: IT Sectr Veröffentlicht: 2026-06-23 Lesezeit: 7 Min.

Lambda ist eine anonyme Funktion, dargestellt als kompakter Ausdruck { Argumente -> Körper }. In Kotlin sind Lambdas die primäre Methode, um Verhalten an Higher-Order-Functions zu übergeben, und bieten eine prägnante Syntax ohne separate Funktionsdeklaration. Laut der Kotlin-Dokumentation (2026) werden über 70% der Higher-Order-Functions in typischen Projekten mit Lambdas aufgerufen. Lambda ermöglicht das Schreiben von Code in funktionalem Stil mit minimalem syntaktischem Rauschen.

Wichtigste Punkte

  • Lambda — eine anonyme Funktion in { args -> body }-Syntax, ohne Namen
  • Implizites it ersetzt das einzelne Argument einer Lambda, vereinfacht die Schreibweise
  • Trailing lambda — die letzte Lambda aus den Aufrufklammern herausnehmen für Lesbarkeit
  • Closure — eine Lambda kann auf Variablen aus dem äußeren Gültigkeitsbereich zugreifen
  • Funktionaler Typ (T) -> R definiert die Signatur der Lambda und wird vom Compiler geprüft

Was ist Lambda?

Lambda (Lambda-Ausdruck) ist eine anonyme Funktion, die als Ausdruck statt als Deklaration definiert wird. Der Begriff stammt aus dem Lambda-Kalkül von Alonzo Church (1936). In der Programmierung ist eine Lambda ein Codeblock, der als Wert übergeben, in einer Variable gespeichert und später aufgerufen werden kann. In Kotlin ist eine Lambda immer in geschweifte Klammern { } eingeschlossen, wobei Argumente durch den Pfeil -> vom Körper getrennt werden.

Eine Lambda unterscheidet sich von einer regulären Funktion durch das Fehlen eines Namens und des Schlüsselworts fun. Dies ermöglicht es, Verhalten direkt am Verwendungspunkt zu deklarieren, ohne den Code mit zusätzlichen Deklarationen zu überladen. Der Kotlin-Compiler leitet Argumenttypen aus dem Kontext ab, sodass Typen in vielen Fällen weggelassen werden können. Eine Lambda ist syntaktischer Zucker über dem funktionalen Typ (T) -> R: Jede Lambda hat einen entsprechenden funktionalen Typ.

Die Hauptverwendung von Lambdas in Kotlin ist die Übergabe an Higher-Order-Functions. Die Standardbibliothek verwendet Lambdas überall: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Lambdas werden auch für Ereignis-Listener, Callbacks und Objektkonfiguratoren über apply und run verwendet, was Code im Vergleich zu anonymen Klassen deklarativer macht.

Syntax von Lambda-Ausdrücken in Kotlin

Die vollständige Form eines Lambda-Ausdrucks in Kotlin: { Argumente -> Lambda_Körper }. Die Argumente werden durch Kommas getrennt aufgelistet, gefolgt von einem Pfeil und dem Körper — einem oder mehreren Ausdrücken. Wenn der Körper mehrere Zeilen enthält, wird der letzte Ausdruck zum Rückgabewert. Wenn eine Funktion eine Lambda als letztes Argument akzeptiert, kann sie außerhalb der Aufrufklammern platziert werden.

kotlin
val sum: (Int, Int) -> Int = { a, b -> a + b }

// Aus Kontext abgeleitete Typen
val sumShort = { a: Int, b: Int -> a + b }

// Lambda-Aufruf
val result = sum(5, 3)  // 8
println(result)

Die Variable sum wird mit einem expliziten funktionalen Typ (Int, Int) -> Int deklariert und mit einer Lambda { a, b -> a + b } initialisiert. Bei sumShort werden die Typen innerhalb der Lambda angegeben und der Variablentyp wird abgeleitet. Beide Varianten sind äquivalent. Der Aufruf einer Lambda unterscheidet sich nicht vom Aufruf einer regulären Funktion — unter Verwendung der Syntax sum(5, 3). Eine Lambda ohne Argumente wird als { body } geschrieben, mit einem Argument — { it -> it * 2 } oder einfach { it * 2 }.

Implizites it und Weglassen von Argumenten

Wenn eine Lambda genau ein Argument akzeptiert, stellt Kotlin den impliziten Namen it bereit. Dies macht die Deklaration des Arguments auf der linken Seite überflüssig. Der Entwickler schreibt nur den Lambda-Körper und verwendet it, um auf den einzelnen Parameter zuzugreifen. Diese Syntax ist besonders praktisch in Verarbeitungsketten von Sammlungen, wo it auf das aktuelle Element verweist.

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

// Expliziter Parametername
val squaredExplicit = numbers.map { n -> n * n }

// Implizites it
val squared = numbers.map { it * it }

// Filtern mit it
val even = numbers.filter { it % 2 == 0 }

println(squared) // [1, 4, 9, 16, 25]

Im Beispiel verwendet map { it * it } it anstelle von n ->. Kotlin weist it automatisch für einen einzelnen Lambda-Parameter zu. Wenn eine Lambda zwei oder mehr Argumente akzeptiert, wird it nicht erstellt — alle Parameter müssen explizit deklariert werden. Für bessere Lesbarkeit von verschachtelten Lambdas sollten Parameter sinnvolle Namen erhalten und it nur in kurzen einzeiligen Prädikaten verwendet werden.

Trailing Lambda und mehrzeilige Lambdas

Trailing Lambda ist ein syntaktisches Merkmal von Kotlin, das es ermöglicht, das letzte Lambda-Argument außerhalb der Funktionsaufrufklammern zu platzieren. Dadurch sieht der Code aus wie eingebaute Sprachkonstrukte. Wenn die Lambda das einzige Argument ist, können die Klammern vollständig weggelassen werden. Dieser Ansatz wird aktiv in der Standardbibliothek und DSLs verwendet.

kotlin
// Standardaufruf
thread(block = {
    println("Hallo vom Thread")
})

// Trailing-Lambda-Version
thread {
    println("Hallo vom Thread")
}

// repeat mit Trailing Lambda
repeat(3) { index ->
    println("Iteration $index")
}

// run mit mehrzeiliger Lambda
val config = run {
    val host = "localhost"
    val port = 8080
    "$host:$port"
}

Die Funktion thread akzeptiert ein Runnable als letztes Argument. Dank der Trailing Lambda kann die Lambda außerhalb der Klammern übergeben werden, was optisch wie ein Codeblock aussieht. Die Funktion repeat nimmt eine Anzahl von Iterationen und eine Lambda mit einem Index entgegen. run ist ein Beispiel für eine Higher-Order-Function, bei der eine mehrzeilige Lambda einen von der letzten Expression zurückgegebenen Wert berechnet. Die Klammern um run() können weggelassen werden, wenn die Lambda das einzige Argument ist.

Variablen-Einfang (Closure) in Lambdas

Variablen-Einfang (Closure) ist die Fähigkeit einer Lambda, auf Variablen zuzugreifen, die im äußeren Gültigkeitsbereich deklariert wurden. In Kotlin kann eine Lambda var-Variablen lesen und ändern sowie val-Variablen aus dem umgebenden Kontext lesen. Eingefangene Variablen werden zusammen mit der Lambda während ihres gesamten Lebenszyklus gespeichert, was Funktionen mit Zustand ermöglicht.

kotlin
fun makeCounter(): () -> Int {
    var count = 0
    return {
        count++  // Einfangzähler
    }
}

fun main() {
    val counter = makeCounter()
    println(counter()) // 0
    println(counter()) // 1
    println(counter()) // 2
}

Die Funktion makeCounter deklariert eine lokale Variable count und gibt eine Lambda { count++ } zurück. Obwohl makeCounter die Ausführung abgeschlossen hat, behält die zurückgegebene Lambda durch die Closure eine Referenz auf count. Jeder Aufruf von counter() erhöht und gibt den aktuellen Wert zurück. Der Closure-Mechanismus liegt Currying, Funktionsfabriken und Memoization zugrunde. Es ist wichtig zu bedenken, dass das Einfangen veränderlicher Variablen bei gleichzeitiger Ausführung zu unerwartetem Verhalten führen kann.

Häufig gestellte Fragen

Kann eine Lambda ein return haben?

Lambda unterstützt kein unbedingtes return — ein return ohne Label gibt die Kontrolle an die äußere Funktion zurück. Um eine Lambda zu verlassen, verwenden Sie return@label, wobei label der Name der Higher-Order-Function ist, an die die Lambda übergeben wurde.

Was ist der Unterschied zwischen einer Lambda und einer anonymen Funktion?

Eine anonyme Funktion wird als fun(a: Int): Int { return a * 2 } geschrieben und unterstützt return ohne Label. Eine Lambda { a -> a * 2 } ist syntaktisch kürzer, benötigt aber return@label für einen vorzeitigen Ausstieg.

Wie übergibt man eine Lambda als Argument ohne Pfeil?

Wenn eine Lambda keine Argumente akzeptiert, wird der Pfeil weggelassen: { body() }. Wenn sie ein Argument akzeptiert, es aber nicht verwendet, schreiben Sie { _ -> body() } mit einem Unterstrich, um den Parameter zu ignorieren.

Erstellt eine Lambda immer ein neues Objekt?

Ja, jede Lambda, die an eine nicht-inline-Funktion übergeben wird, erzeugt eine Instanz einer anonymen Klasse. Bei Inline-Funktionen wird die Lambda an der Aufrufstelle eingefügt, ohne ein Objekt zu erstellen. Nicht-einfangende Lambdas werden als Singleton-Objekte gecached.

Warum kann return nicht direkt in einer Lambda verwendet werden?

Return ist in Kotlin ein Sprungoperator, der zur nächsten mit fun deklarierten Funktion gehört. Eine Lambda ist keine Funktion (fun), sondern ein Ausdruck. Daher wird ein return innerhalb einer Lambda ohne Label als Rückkehr aus der äußeren umschließenden Funktion behandelt.

Zusammenfassung

  • Lambda — anonyme Funktion in { args -> body }-Syntax, als Wert an Higher-Order-Functions übergeben
  • Implizites it ersetzt das einzelne Argument und macht Code in kurzen Prädikaten kompakter
  • Trailing Lambda setzt die letzte Lambda außerhalb der Aufrufklammern und liest sich wie ein Codeblock
  • Closure ermöglicht einer Lambda den Zugriff auf Variablen aus dem äußeren Kontext nach Abschluss der umschließenden Funktion
  • Funktionaler Typ (T) -> R definiert die Lambda-Signatur mit Überprüfung zur Compile-Zeit
  • Inline-Funktionen vermeiden die Erstellung anonymer Klassen für Lambdas und verbessern die Leistung in Schleifen
  • Mehrzeilige Lambdas geben den Wert des letzten Ausdrucks zurück und unterstützen komplexe Berechnungen ohne separate Funktionsdeklaration

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch