Higher-order function: Was es ist, Eigenschaften und Beispiele in Kotlin

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

Eine higher-order function ist eine Funktion, die eine andere Funktion als Parameter annimmt oder eine Funktion als Ergebnis zurückgibt. In Kotlin sind Funktionen First-Class-Bürger: Sie können in Variablen gespeichert, als Argumente übergeben und zurückgegeben werden. Laut der Kotlin-Dokumentation (2026) reduzieren higher-order functions Code-Duplizierung im Durchschnitt um 30% im Vergleich zu imperativen Ansätzen. Higher-order function ist ein grundlegendes Konzept des funktionalen Stils in der modernen Entwicklung.

Wichtige Punkte

  • Higher-order function — eine Funktion, die eine andere Funktion als Parameter nimmt oder eine zurückgibt
  • Funktionaler Typ (T) -> R — die Grundlage für die Deklaration von Funktionsparametern in einer Signatur
  • Lambda-Ausdruck — eine kompakte Möglichkeit, eine Funktion an eine higher-order function zu übergeben
  • Verhaltensübergabe ermöglicht die Parametrisierung von Operationen ohne Vererbung und Schnittstellen
  • Rückgabe einer Funktion von einer higher-order function wird für Fabriken und Closures verwendet

Was ist eine higher-order function?

Eine Higher-order function ist eine Funktion, die mindestens eine von zwei Eigenschaften besitzt: eine andere Funktion als Argument zu nehmen oder eine Funktion als Ergebnis zurückzugeben. In der Mathematik werden solche Funktionen als Funktionale oder Operatoren bezeichnet. In der Programmierung erschienen sie 1958 in Lisp und wurden zu einem obligatorischen Bestandteil aller modernen Sprachen — JavaScript, Python, Swift, Kotlin, Scala und Haskell. Eine higher-order function ermöglicht es, von einer bestimmten Operation zu abstrahieren und Verhalten als Wert zu übergeben.

Der Hauptunterschied zwischen einer higher-order function und einer gewöhnlichen Funktion ist das Vorhandensein eines Parameters mit funktionalem Typ oder eines zurückgegebenen funktionalen Werts. In Kotlin wird ein funktionaler Typ als (ParamType) -> ReturnType geschrieben. Beispielsweise bedeutet der Typ (Int) -> String eine Funktion, die Int annimmt und String zurückgibt. Der Typ () -> Unit bezeichnet eine Funktion ohne Parameter, die keinen nützlichen Wert zurückgibt. Dieses Typsystem macht higher-order functions typsicher.

Das Gegenteil einer higher-order function ist eine First-Class-Funktion. Eine First-Class-Funktion bedeutet, dass eine Funktion wie jeder andere Wert verwendet werden kann: einer Variablen zugewiesen, in einer Sammlung gespeichert, als Argument übergeben. Eine higher-order function ist eine Funktion, die First-Class-Funktionen zum Annehmen oder Zurückgeben verwendet. Kotlin unterstützt beide Konzepte auf Sprachebene ohne zusätzliche Bibliotheken.

Wie funktioniert eine higher-order function in Kotlin?

In Kotlin wird jede Funktion, die mindestens einen Parameter mit einem funktionalen Typ deklariert hat oder deren Rückgabetyp funktional ist, automatisch als higher-order function betrachtet. Der Compiler benötigt keine spezielle Annotation — es reicht aus, (T) -> R in der Signatur anzugeben. Beim Aufruf einer solchen Funktion ist das Argument entweder ein Lambda-Ausdruck, ein Verweis auf eine vorhandene Funktion via :: oder ein in einer Variablen gespeicherter funktionaler Wert.

kotlin
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val sum = operate(10, 20) { x, y -> x + y }
    println(sum) // 30
}

Im Listing nimmt die Funktion operate zwei ganze Zahlen und einen Parameter op vom Typ (Int, Int) -> Int. Der Funktionskörper ruft die übergebene Operation in einer einzigen Zeile auf. In main übergibt der Aufruf von operate das Lambda { x, y -> x + y } — Kotlin platziert es dank der Trailing-Lambda-Syntax nach den Klammern. Wenn das Lambda das letzte Argument wäre, könnte es vollständig aus den Klammern herausbewegt werden, was die Lesbarkeit von Aufrufketten verbessert.

Intern kompiliert Kotlin higher-order functions über das Function-Interface (Function2 für zwei Parameter). Jedes Lambda wird in eine anonyme Klasse umgewandelt, die das entsprechende FunctionN-Interface implementiert. Dies bedeutet, dass das Erstellen eines Lambdas eine Objektzuweisung für jede Operation mit sich bringt. Um den Overhead zu reduzieren, unterstützt Kotlin Inline-Funktionen, die den Körper der higher-order function am Aufrufort ersetzen und die Erstellung der anonymen Klasse eliminieren.

Funktionen als Parameter: Verhaltensübergabe

Das Übergeben einer Funktion als Argument ist das häufigste Muster zur Verwendung von higher-order functions. Anstatt eine Klassenhierarchie mit einer polymorphen Methode zu erstellen, übergibt der Entwickler das gewünschte Verhalten direkt an den Verwendungspunkt. Dies implementiert das Open/Closed-Prinzip ohne Vererbung: Eine neue Operation wird als neues Lambda hinzugefügt, nicht als neue Unterklasse.

Für nullable-Funktionen verwendet Kotlin den Typ ((T) -> R)? mit einem Fragezeichen nach den Klammern. Eine solche Funktion kann nur nach einer Null-Prüfung oder über den ?.invoke()-Operator aufgerufen werden. In diesem Fall gibt die Signatur der higher-order function explizit an, dass das Übergeben einer Funktion optional ist — der aufrufende Code kann das Argument weglassen. Dies ist nützlich für Callbacks und Event-Handler mit optionalem Verhalten.

kotlin
fun <T> List<T>.customFilter(
    predicate: (T) -> Boolean
): List<T> {
    val result = mutableListOf<T>()
    for (item in this) {
        if (predicate(item)) result.add(item)
    }
    return result
}

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    val even = numbers.customFilter { it % 2 == 0 }
    println(even) // [2, 4]
}

Die Erweiterungsfunktion customFilter nimmt einen Parameter predicate vom funktionalen Typ (T) -> Boolean. Innerhalb der Schleife ruft sie predicate für jedes Element auf und sammelt die passenden. Der Aufruf in main übergibt das Lambda { it % 2 == 0 }, wobei it der implizite Name des einzigen Lambda-Parameters ist. Dank higher-order functions ist die Filterlogik vollständig vom Traversierungsmechanismus der Sammlung isoliert.

Funktionen als Rückgabewerte

Eine higher-order function kann eine Funktion zurückgeben — dieses Muster wird als Funktionsfabrik oder Verhaltensgenerator bezeichnet. Die zurückgegebene Funktion kann Variablen aus dem externen Bereich erfassen (Closure) und zwischen Aufrufen bewahren. Dies ermöglicht die Erstellung konfigurierbarer Handler und spezialisierter Operationen basierend auf allgemeinen Vorlagen.

Beim Zurückgeben einer Funktion leitet Kotlin den zurückgegebenen funktionalen Typ ((T) -> R)? aus der Signatur ab. Der Compiler prüft, dass alle return-Ausdrücke im Körper kompatible funktionale Werte zurückgeben. Erfasste Variablen werden im Lambda-Objekt gespeichert und bleiben zugänglich, solange ein Verweis darauf existiert. Dies ist ein leistungsstarker Mechanismus, erfordert jedoch Aufmerksamkeit bei der Speicherverwaltung.

kotlin
fun makeMultiplier(factor: Int): (Int) -> Int {
    return { x -> x * factor }
}

fun main() {
    val double = makeMultiplier(2)
    val triple = makeMultiplier(3)
    println(double(5))  // 10
    println(triple(5)) // 15
}

Die Funktion makeMultiplier nimmt einen Faktor und gibt ein Lambda { x -> x * factor } zurück, wobei factor aus dem äußeren Bereich (Closure) erfasst wird. Jeder Aufruf von makeMultiplier erstellt eine neue Funktion mit ihrem eigenen factor-Wert. Die Variablen double und triple speichern die zurückgegebenen Funktionen und können mehrfach aufgerufen werden. Dieses Muster wird häufig in der HTTP-Client-Konfiguration, Dekorateuren und Middleware verwendet.

Higher-order function mit Lambdas: Beispiele

Die Kombination von higher-order functions und Lambdas ermöglicht den Aufbau ausdrucksstarker Operationsketten ohne Zwischenvariablen. Die Kotlin-Standardbibliothek enthält Dutzende von higher-order functions: let, run, apply, also, filter, map, flatMap, fold, reduce, forEach, groupBy und andere. Jede nimmt ein Lambda und führt damit eine Datentransformation durch.

kotlin
data class User(val name: String, val age: Int)

fun main() {
    val users = listOf(
        User("Alice", 25),
        User("Bob", 17),
        User("Charlie", 30)
    )

    val result = users
        .filter { it.age >= 18 }
        .map { it.name.uppercase() }
        .sorted()
    println(result) // [ALICE, CHARLIE]
}

Im Beispiel verarbeitet eine Kette von drei higher-order functions eine Liste von Benutzern. filter nimmt ein Prädikat und behält nur Erwachsene. map transformiert jeden Benutzer in einen Namen in Großbuchstaben. sorted sortiert das Ergebnis aufsteigend. Jede Operation nimmt ein Lambda, und Kotlin gewährleistet Typsicherheit in jeder Phase. Ohne higher-order functions müsste man eine Schleife mit if, temporären Listen und manueller Sortierung schreiben.

Häufig gestellte Fragen

Wie unterscheidet sich eine higher-order function von einer gewöhnlichen Funktion?

Eine Higher-order function nimmt eine andere Funktion als Parameter oder gibt eine zurück. Eine gewöhnliche Funktion arbeitet nur mit Daten — Zahlen, Zeichenketten, Objekten. Eine higher-order function arbeitet mit Verhalten und übergibt Logik als Argument.

Kann eine higher-order function inline sein?

Ja, der inline-Modifikator beseitigt den Overhead der Erstellung einer anonymen Klasse für ein Lambda. Mit crossinline oder noinline kann gesteuert werden, welche Lambdas ersetzt werden und welche als Objekte bleiben.

Was ist der funktionale Typ einer Funktion ohne Parameter?

Eine Funktion ohne Parameter und ohne Rückgabewert hat den Typ () -> Unit. Eine Funktion mit einem Parameter vom Typ T und Rückgabe R wird als (T) -> R geschrieben. Für zwei Parameter — (T, U) -> R, und so weiter bis zu 22 Argumenten.

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

Ein Lambda ist eine kurze Schreibweise { args -> body }, eine anonyme Funktion ist fun(args): ReturnType { body }. Ein Lambda kann kein return ohne Label haben, eine anonyme Funktion schon. Beide können an eine higher-order function übergeben werden.

Wann sollte man higher-order functions vermeiden?

Vermeiden Sie higher-order functions in heißen Schleifen ohne inline — jedes Lambda erstellt ein Objekt. Für leistungskritischen Code verwenden Sie inline fun. Vermeiden Sie auch tief verschachtelte Lambdas — dies verringert die Lesbarkeit.

Zusammenfassung

  • Higher-order function — eine Funktion, die eine andere Funktion als Parameter nimmt oder eine zurückgibt; die Grundlage der funktionalen Programmierung in Kotlin
  • Funktionaler Typ (T) -> R deklariert einen Funktionsparameter mit typsicherer Signatur
  • Lambda-Ausdruck — kompakte Syntax { args -> body } zum Übergeben von Verhalten
  • Inline-Funktionen beseitigen den Overhead der Erstellung anonymer Klassen für Lambdas
  • Funktionsfabriken geben eine Funktion mit erfasstem Kontext über den Closure-Mechanismus zurück
  • Operationsketten filter-map-sorted werden mit higher-order functions ohne Zwischenvariablen aufgebaut
  • Typsicherheit von higher-order functions wird durch Kotlins funktionales Typsystem zur Compile-Zeit gewährleistet

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