English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin Lambda-Ausdruck

Lambda-Ausdruck

Ein Lambda-Ausdruck oder kurz lambda ist eine anonyme Funktion; eine Funktion ohne Namen. Diese Funktionen werden sofort als Ausdruck übergeben, ohne dass eine Deklaration erforderlich ist. Zum Beispiel:

fun main(args: Array<String>) {
    val greeting = { println("Hello!")}
    //Funktion aufrufen
    greeting()
}

Wenn das Programm ausgeführt wird, wird ausgegeben:

Hallo!

Hier wird der Lambda-Ausdruck der Variablen greeting zugewiesen. Dieser Ausdruck akzeptiert in diesem Programm keine Parameter und gibt auch keinen Wert zurück.

Rufen Sie die Funktion (Lambda-Ausdruck) dann wie folgt auf:

greeting()

Beispiel: Lambda mit Parameter und Rückgabetyp

Das folgende Programm hat einen Lambda-Ausdruck, der zwei Ganzzahlen als Parameter annimmt und das Produkt dieser beiden Ganzzahlen zurückgibt.

fun main(args: Array<String>) {
    val product = { a: Int, b: Int -> a * b}
    val result = product(9, 3)
    println(result)
}

Wenn das Programm ausgeführt wird, wird ausgegeben:

27

Hier ist der Lambda-Ausdruck:

Beachten Sie, dass die Klammern einen Lambda-Ausdruck enthalten.

Höhere Funktionen

Kotlin bietet starke Unterstützung für funktionalen Programmierung. Sie können Funktionen als Parameter an andere Funktionen übergeben. Außerdem können Sie aus anderen Funktionen eine Funktion zurückgeben. Diese Funktionen werden höhere Funktionen genannt.

Aus Gründen der Bequemlichkeit werden Lambda-Ausdrücke normalerweise an höhere Funktionen übergeben (statt an typische Funktionen).

Beispiel: Übergabe eines Lambda-Ausdrucks an eine Funktion

Lassen Sie uns Lambda-Ausdrücke an höhere Funktionen übergeben. Dies ist Ihre Vorgehensweise.

fun callMe(greeting: ()}} -> Unit) {
    greeting()
}
fun main(args: Array<String>) {
    callMe({ println("Hallo!") })
}

Wenn das Programm ausgeführt wird, wird ausgegeben:

Hallo!

Hier ist callMe() eine höhere Funktion (weil sie Funktionen als Parameter annimmt). Der Parameter greeting akzeptiert die Lambda, die an die Funktion callMe() übergeben wird:

 greeting: () -> Unit

Leere Klammern bedeuten, dass die übergebene anonyme Funktion keine Parameter akzeptiert. Und das Schlüsselwort Unit bedeutet, dass die anonyme Funktion keinen Wert zurückgibt.

Lambda wird oft beim Verarbeiten von Sammlungen verwendet. Und es gibt mehrere eingebettete Funktionen in der Standardbibliothek, die Lambda verwenden, um unsere Aufgaben zu vereinfachen. Hier sehen Sie einige Beispiele:

Beispiel: maxBy() Funktion

Die Funktion maxBy() gibt das erste Element zurück, das den angegebenen Funktionswert erzeugt; wenn keine Elemente vorhanden sind, wird null zurückgegeben.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    val people = listOf(
            Person("Jack", 34),}}
            Person("Shelly", 19),}}
            Person("Patrick", 13),}}
            Person("Jill", 12),}}
            Person("Shane", 22),}}
            Person("Joe", 18)
            )
    val selectedPerson = people.maxBy({ person ->  person.age })
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

Wenn das Programm ausgeführt wird, wird ausgegeben:

Person(name=Jack, age=34)
name: Jack
age: 34

Hier erhält die Funktion maxBy() eine Liste von Person-Objekten und gibt das Person-Objekt mit dem höchsten Alter zurück.

Schlüsselwort it: für einen Parameter

Im obigen Programm akzeptiert die Lambda-Ausdrucksfunktion nur einen Parameter (Liste von Person-Objekten). In diesem Fall kann das Schlüsselwort it verwendet werden, um auf den Parameter zu verweisen.

Sie können

val selectedPerson = people.maxBy({ person -> person.age })

Äquivalent zu

val selectedPerson = people.maxBy({ it.age })

Im obigen Programm.

Beispiel: maxBy() und startsWith() Funktionen

Das folgende Programm berechnet das höchste Alter der Person-Objekte, die mit dem Buchstaben S beginnen.

Wir werden die Bibliotheksfunktionen maxBy() und startsWith() verwenden, um diese Aufgabe zu erledigen. Wenn die Funktion startsWith() mit dem als Parameter übergebenen Zeichen beginnt, wird true zurückgegeben.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    val people = listOf(
            Person("Jack", 34),}}
            Person("Shelly", 19),}}
            Person("Patrick", 13),}}
            Person("Jill", 12),}}
            Person("Shane", 22),}}
            Person("Joe", 18)
            )
    val selectedPerson = people
            .filter { it.name.startsWith("S") }
            .maxBy{ it.age }
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

Wenn das Programm ausgeführt wird, wird ausgegeben:

Person(name=Shane, age=22)
name: Shane
age: 22