Lambda izrazi
Lambda izraz ili jednostavno lambda anonimna je funkcija; funkcija bez imena. Te se funkcije prosljeđuju odmah kao izraz bez deklaracije. Na primjer,
fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )
Kada pokrenete program, izlaz će biti:
Zdravo!
Ovdje je lambda izraz dodijeljen promjenjivom pozdravu. Izraz ne prihvaća nikakve parametre i ne vraća vrijednost u ovom programu.
Zatim se funkcija (lambda izraz) poziva kao:
pozdrav()
Primjer: Lambda s parametrima i tipom povratka
Program u nastavku ima lambda izraz koji prihvaća dvije cjelobrojne vrijednosti kao parametre i vraća umnožak te dvije cjelobrojne vrijednosti.
fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )
Kada pokrenete program, izlaz će biti:
27
Ovdje je lambda izraz:
Napominjemo da je lambda izraz zatvoren unutar kovrčavih zagrada.
Funkcija višeg reda
Koltin ima veliku podršku za funkcionalno programiranje. Možete proslijediti funkcije kao argumente drugim funkcijama. Također, možete vratiti funkciju iz drugih funkcija. Te se funkcije nazivaju funkcijama višeg reda.
Često se lambda izrazi radi praktičnosti prenose u funkciju višeg reda (umjesto u tipičnu funkciju).
Primjer: Prenošenje Lambde u funkciju
Proslijedimo lambda izraz funkciji višeg reda. Evo kako to možete učiniti.
fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )
Kada pokrenete program, izlaz će biti:
Zdravo!
Ovdje callMe()
je funkcija višeg reda (jer uzima funkciju kao parametar). Parametar pozdrava prihvaća lambda proslijeđenu callMe()
funkciji kao:
pozdrav: () -> Jedinica
Prazne zagrade sugeriraju da proslijeđena anonimna funkcija ne prihvaća nikakve parametre. I, Unit
ključna riječ sugerira da anonimna funkcija ne vraća nikakvu vrijednost.
Lambde se često koriste tijekom rada s kolekcijama. U standardnoj je biblioteci dostupno nekoliko ugrađenih funkcija koje uzimaju lambde kako bi nam olakšale zadatak. Ovdje ćete vidjeti nekoliko primjera:
Primjer: funkcija maxBy ()
Funkcija maxBy () vraća prvi element koji daje najveću vrijednost zadane funkcije ili null
ako nema elemenata.
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)" ) )
Kada pokrenete program, izlaz će biti:
Osoba (ime = Jack, dob = 34) ime: Jack dob: 34
Ovdje maxBy()
funkcija uzima popis Person objekata i vraća Person objekt koji ima maksimalnu dob.
it Ključna riječ: koristi se za jedan parametar
U gornjem programu, lambda izraz prihvaća samo jedan parametar (popis objekata Osobe). U takvim slučajevima možete uputiti argument pomoću ključne riječi it
.
Možete zamijeniti
val selectedPerson = people.maxBy ((person -> person.age))
s
val selectedPerson = people.maxBy ((it.age))
u gornjem programu.
Primjer: maxBy () i startWith () funkcija
Program u nastavku izračunava maksimalnu dob objekta Osobe koja počinje slovom S.
Mi ćemo koristiti dvije knjižnice funkcija maxBy()
i startsWith()
kako bi ostvarili taj zadatak. Funkcija starsWith () vraća se true
ako započne s navedenim znakom koji se prosljeđuje kao 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)" ) )
Kada pokrenete program, izlaz će biti:
Osoba (ime = Shane, dob = 22) ime: Shane dob: 22
Preporučena čitanja
- Zatvaranje Kotlina
- Kotlin Uz i prijaviti se