Lambda — je anonymní funkce prezentovaná jako kompaktní výraz { argumenty -> tělo }. V Kotlinu jsou lambdy hlavním způsobem předávání chování funkcím vyššího řádu (higher-order functions) a poskytují stručnou syntaxi bez nutnosti deklarovat samostatnou funkci. Podle dokumentace Kotlinu (2026) je více než 70 % funkcí vyššího řádu v typických projektech voláno s lambdami. Lambda umožňuje psát kód ve funkcionálním stylu s minimálním syntaktickým šumem.
Hlavní body
Lambda (lambda výraz) — je anonymní funkce definovaná jako výraz, nikoli deklarace. Termín pochází z lambda kalkulu Alonza Churcha (1936). V programování lambda představuje blok kódu, který může být předán jako hodnota, uložen v proměnné a později zavolán. V Kotlinu je lambda vždy uzavřena do složených závorek { }, argumenty jsou od těla odděleny šipkou ->.
Lambda se od běžné funkce liší absencí názvu a klíčového slova fun. To umožňuje deklarovat chování přímo v místě použití, aniž by byl kód zaneřáděn dalšími deklaracemi. Kompilátor Kotlinu odvozuje typy argumentů z kontextu, takže v mnoha případech lze typy vynechat. Lambda je syntaktický cukr nad funkcionálním typem (T) -> R: každá lambda má odpovídající funkcionální typ.
Hlavní použití lambd v Kotlinu je předávání funkcím vyššího řádu (higher-order functions). Standardní knihovna používá lambdy všude: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Lambdy se také používají pro vytváření posluchačů událostí, zpětných volání, konfigurátorů objektů pomocí apply a run, což činí kód deklarativnějším ve srovnání s anonymními třídami.
Úplná forma lambda výrazu v Kotlinu: { argumenty -> tělo_lambdy }. Argumenty jsou vyjmenovány čárkou, následuje šipka a tělo — jeden nebo více výrazů. Pokud tělo obsahuje více řádků, poslední výraz se stává návratovou hodnotou. Pokud funkce přijímá lambdu jako poslední argument, může být umístěna mimo závorky volání.
val sum: (Int, Int) -> Int = { a, b -> a + b }
// Typy odvozené z kontextu
val sumShort = { a: Int, b: Int -> a + b }
// Volání lambdy
val result = sum(5, 3) // 8
println(result)
Proměnná sum je deklarována s explicitním funkcionálním typem (Int, Int) -> Int a inicializována lambdou { a, b -> a + b }. Pro sumShort jsou typy uvedeny uvnitř lambdy a typ proměnné je odvozen. Obě varianty jsou ekvivalentní. Volání lambdy se neliší od volání běžné funkce — používá se syntaxe sum(5, 3). Lambda bez argumentů se zapisuje jako { body }, s jedním argumentem — { it -> it * 2 } nebo jednoduše { it * 2 }.
Když lambda přijímá přesně jeden argument, Kotlin poskytuje implicitní název it. To eliminuje potřebu deklarovat argument na levé straně. Programátor píše pouze tělo lambdy a používá it pro přístup k jedinému parametru. Tato syntaxe je obzvláště vhodná v řetězcích zpracování kolekcí, kde it označuje aktuální prvek.
val numbers = listOf(1, 2, 3, 4, 5)
// Explicitní název parametru
val squaredExplicit = numbers.map { n -> n * n }
// Implicitní it
val squared = numbers.map { it * it }
// Filtrování s it
val even = numbers.filter { it % 2 == 0 }
println(squared) // [1, 4, 9, 16, 25]
V příkladu map { it * it } se používá it místo deklarace n ->. Kotlin automaticky přiřadí it jedinému parametru lambdy. Pokud lambda přijímá dva nebo více argumentů, it se nevytváří — všechny parametry musí být deklarovány explicitně. Pro lepší čitelnost vnořených lambd se doporučuje dávat parametrům smysluplné názvy a používat it v krátkých jednořádkových predikátech.
Trailing lambda (koncová lambda) — syntaktická vlastnost Kotlinu, která umožňuje umístit poslední argument-lambdu mimo kulaté závorky volání funkce. Tím se kód podobá vestavěným jazykovým konstrukcím. Pokud je lambda jediným argumentem, závorky lze zcela vynechat. Tento přístup je aktivně používán ve standardní knihovně a DSL.
// Standardní volání
thread(block = {
println("Ahoj z vlákna")
})
// Verze s trailing lambda
thread {
println("Ahoj z vlákna")
}
// repeat s trailing lambdou
repeat(3) { index ->
println("Iterace $index")
}
// run s víceřádkovou lambdou
val config = run {
val host = "localhost"
val port = 8080
"$host:$port"
}
Funkce thread přijímá Runnable jako poslední argument. Díky trailing lambdě lze lambdu předat mimo závorky, což vizuálně připomíná blok kódu. Funkce repeat přijímá počet iterací a lambdu s indexem. run — příklad funkce vyššího řádu, kde víceřádková lambda vypočítává hodnotu vrácenou posledním výrazem. Závorky kolem run() lze vynechat, pokud je lambda jediným argumentem.
Zachycení proměnných (closure) — schopnost lambdy přistupovat k proměnným deklarovaným ve vnějším rozsahu viditelnosti. V Kotlinu může lambda číst a měnit proměnné var, stejně jako číst proměnné val z okolního kontextu. Zachycené proměnné jsou ukládány spolu s lambdou po celý její životní cyklus, což umožňuje vytvářet funkce se stavem.
fun makeCounter(): () -> Int {
var count = 0
return {
count++ // počet zachycení
}
}
fun main() {
val counter = makeCounter()
println(counter()) // 0
println(counter()) // 1
println(counter()) // 2
}
Funkce makeCounter deklaruje lokální proměnnou count a vrací lambdu { count++ }. Přestože makeCounter dokončila svou práci, vrácená lambda si udržuje odkaz na count prostřednictvím uzávěru (closure). Každé volání counter() zvyšuje a vrací aktuální hodnotu. Mechanismus closure tvoří základ currying, továren funkcí a memoizace. Je důležité si pamatovat, že zachycení měnitelných proměnných může vést k neočekávanému chování při paralelním provádění.
Často kladené otázky
Lambda nepodporuje bezpodmínečný return — return bez návěstí vrací řízení vnější funkci. Pro opuštění lambdy použijte return@label, kde label je název funkce vyššího řádu, které byla lambda předána.
Anonymní funkce se zapisuje jako fun(a: Int): Int { return a * 2 } a podporuje return bez návěstí. Lambda { a -> a * 2 } je syntakticky kratší, ale pro předčasný návrat vyžaduje return@label.
Pokud lambda nepřijímá argumenty, šipka se vynechává: { body() }. Pokud přijímá jeden argument a nepoužívá jej, místo šipky se píše { _ -> body() } s podtržítkem pro ignorování parametru.
Ano, každá lambda předaná neinline funkci vytváří instanci anonymní třídy. Pro inline funkce je lambda vložena na místo volání bez vytvoření objektu. Nezachycující (non-capturing) lambdy jsou ukládány do singleton objektů.
Return je v Kotlinu operátor skoku patřící k nejbližší funkci s fun. Lambda není funkce (fun), ale výraz. Proto je return uvnitř lambdy bez návěstí považován za návrat z vnější obklopující funkce.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také