English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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()
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.
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).
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:
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.
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.
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