Lambda výrazy
Lambda výraz alebo jednoducho lambda je anonymná funkcia; funkcia bez názvu. Tieto funkcie sa odovzdajú okamžite ako výraz bez deklarácie. Napríklad,
fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )
Po spustení programu bude výstup:
Ahoj!
Tu je výrazu lambda priradený premenný pozdrav. Výraz neakceptuje žiadne parametre a nevracia žiadnu hodnotu v tomto programe.
Potom sa funkcia (výraz lambda) vyvolá ako:
pozdrav ()
Príklad: Lambda s parametrami a návratovým typom
Program uvedený nižšie má výraz lambda, ktorý ako parametre prijíma dve celé čísla a vracia súčin týchto dvoch celých čísel.
fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )
Po spustení programu bude výstup:
27
Výraz lambda je tu:
Upozorňujeme, že vo vnútri zložených zátvoriek je uzavretý výraz lambda.
Funkcia vyššieho rádu
Koltin má veľkú podporu pre funkčné programovanie. Funkcie môžete odovzdať ako argumenty iným funkciám. Môžete tiež vrátiť funkciu z iných funkcií. Tieto funkcie sa nazývajú funkcie vyššieho rádu.
Výrazy lambda sa často kvôli pohodlnosti odovzdávajú funkcii vyššieho rádu (a nie typickej funkcii).
Príklad: Prenesenie lambdy do funkcie
Poďme odovzdať výraz lambda funkcii vyššieho rádu. Takto to môžete urobiť.
fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )
Po spustení programu bude výstup:
Ahoj!
Tu callMe()
je funkcia vyššieho rádu (pretože funkciu berie ako parameter). Parameter pozdrav prijíma lambdu odovzdanú callMe()
funkcii ako:
pozdrav: () -> Jednotka
Prázdna zátvorka naznačuje, že odovzdaná anonymná funkcia neprijíma žiadne parametre. A je Unit
kľúčové slovo naznačujú, že anonymný funkcia nevracia žiadnu hodnotu.
Lambdy sa často používajú pri práci so zbierkami. V štandardnej knižnici je k dispozícii niekoľko zabudovaných funkcií, ktoré pomocou lambdas uľahčujú vykonávanie našich úloh. Tu uvidíte niekoľko príkladov:
Príklad: funkcia maxBy ()
Funkcia maxBy () vráti prvý prvok, ktorý poskytne najväčšiu hodnotu danej funkcie alebo null
ak neexistujú žiadne prvky.
data class Person(val name: String, val age: Int) fun main(args: Array) ( 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)" ) )
Po spustení programu bude výstup:
Osoba (meno = Jack, vek = 34) meno: Jack vek: 34
Tu maxBy()
funkcia prevezme zoznam objektov Person a vráti objekt Person s maximálnym vekom.
it Kľúčové slovo: Používa sa pre jeden parameter
Vo vyššie uvedenom programe výraz lambda akceptuje iba jeden parameter (zoznam objektov Person). V takýchto prípadoch môžete argument odkázať pomocou kľúčového slova it
.
Môžete nahradiť
val selectedPerson = people.maxBy ((person -> person.age))
s
val selectedPerson = people.maxBy ((it.age))
vo vyššie uvedenom programe.
Príklad: funkcia maxBy () a startsWith ()
Program uvedený nižšie počíta maximálny vek objektu osoby začínajúci sa písmenom S.
Budeme používať dva knižničný funkcie maxBy()
a startsWith()
na splnenie tejto úlohy. Funkcia starsWith () sa vráti, true
ak začína zadaným znakom odovzdaným ako argument.
data class Person(val name: String, val age: Int) fun main(args: Array) ( 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)" ) )
Po spustení programu bude výstup:
Osoba (meno = Shane, vek = 22) meno: Shane vek: 22
Odporúčané čítania
- Kotlinove uzávery
- Kotlin S a podať žiadosť