Lambda: co to je, syntaxe a použití v Kotlinu

Autor: IT Sectr Publikováno: 2026-06-23 Doba čtení: 7 min

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 — anonymní funkce v syntaxi { args -> body }, bez názvu
  • Implicitní název it nahrazuje jediný argument lambdy, zjednodušuje zápis
  • Trailing lambda — přesun poslední lambdy mimo závorky volání pro čitelnost
  • Zachycení (closure) — lambda může přistupovat k proměnným z vnějšího rozsahu viditelnosti
  • Funkcionální typ (T) -> R určuje signaturu lambdy a je kontrolován kompilátorem

Co je lambda?

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.

Syntaxe lambda výrazů v Kotlinu

Ú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í.

kotlin
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 }.

Implicitní název it a vynechávání argumentů

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.

kotlin
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 a víceřádkové lambdy

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.

kotlin
// 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) v lambdách

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.

kotlin
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

Může mít lambda return?

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.

Jaký je rozdíl mezi lambdou a anonymní funkcí?

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.

Jak předat lambdu jako argument bez šipky?

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.

Vytváří lambda vždy nový objekt?

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ů.

Proč nelze v lambdě použít return přímo?

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í

  • Lambda — anonymní funkce v syntaxi { args -> body }, předávaná jako hodnota funkci vyššího řádu
  • Implicitní název it nahrazuje jediný argument a činí kód kompaktnějším v krátkých predikátech
  • Trailing lambda přesouvá poslední lambdu mimo závorky volání pro čtení jako blok kódu
  • Zachycení (closure) umožňuje lambdě přistupovat k proměnným z vnějšího kontextu po dokončení obklopující funkce
  • Funkcionální typ (T) -> R určuje signaturu lambdy s kontrolou v době kompilace
  • Inline funkce eliminují vytváření anonymních tříd pro lambdy, zvyšují výkon ve smyčkách
  • Víceřádkové lambdy vracejí hodnotu posledního výrazu a podporují složité výpočty bez deklarace samostatné funkce

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í.

Prodiskutovat projekt

Přečtěte si také