Lamda výraz - zizanek/-github-tz-pma-2026-priprava GitHub Wiki
6. Lambda výrazy v Kotlinu
6.1 Co vlastně dělá tento řádek?
V naší aplikaci máme tři kola, mezi kterými uživatel vybírá pomocí RadioButtonů.
Potřebujeme zajistit, aby se při každé změně výběru automaticky přepočítala cena.
K tomu slouží:
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
Přečíst si ho můžeme jednoduše:
„Když uživatel změní vybrané kolo, spusť funkci updatePrice().“
Rozložme si řádek na jednotlivé části:
| Část kódu | Co znamená |
|---|---|
binding.rgBikes |
Naše skupina tlačítek pro výběr kola |
setOnCheckedChangeListener |
Nastaví posluchače, který reaguje na změnu výběru |
{ ... } |
Kód, který se má při změně vykonat |
_, _ |
Dva parametry, které dostáváme, ale nepotřebujeme |
-> |
Odděluje parametry od příkazů |
updatePrice() |
Zavolá naši funkci pro výpočet ceny |
6.2 Co je lambda výraz?
Lambda je funkce bez názvu, kterou můžeme napsat přímo tam, kde ji potřebujeme.
Běžnou funkci už známe:
fun pozdrav() {
println("Ahoj!")
}
Lambda může vypadat takto:
val pozdrav = {
println("Ahoj!")
}
Obě varianty mohou vykonat stejný příkaz. Rozdíl je v tom, že druhá varianta vytváří funkci bez vlastního názvu a ukládá ji do proměnné pozdrav.
V Androidu lambdy často používáme k tomu, abychom určili, co se má stát po kliknutí, změně výběru nebo jiné události.
Například:
binding.btnOrder.setOnClickListener {
println("Uživatel klikl na objednat")
}
Tím Androidu říkáme, co má vykonat, až uživatel klikne na tlačítko.
Důležité je, že příkazy uvnitř lambdy se v tomto případě nespustí okamžitě, ale až při kliknutí.
6.3 Jak vypadá lambda výraz?
Obecný zápis lambdy:
{ parametry -> příkazy }
- Složené závorky
{ }– ohraničují lambda výraz. - Parametry – informace, které lambda může dostat.
- Šipka
->– odděluje parametry od příkazů. - Příkazy – kód, který se má vykonat.
Například:
{ jmeno -> println("Ahoj, $jmeno!") }
Lambda dostane jméno a vypíše pozdrav.
Pokud lambda žádné parametry nepotřebuje, může být zápis ještě jednodušší:
{ println("Ahoj!") }
6.4 K čemu jsou podtržítka?
Vraťme se k našemu kódu:
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
Když uživatel změní výběr, Android nám automaticky předá dvě informace:
group– skupinuRadioGroup, ve které došlo ke změně.checkedId– ID nově vybranéhoRadioButtonu.
Mohli bychom tedy napsat:
binding.rgBikes.setOnCheckedChangeListener { group, checkedId ->
updatePrice()
}
Jenže my ani jednu informaci nepotřebujeme!
Naše funkce updatePrice() si totiž sama zjistí, které kolo je právě vybrané, pomocí:
binding.rgBikes.checkedRadioButtonId
Proto můžeme napsat:
binding.rgBikes.setOnCheckedChangeListener { _, _ ->
updatePrice()
}
Podtržítko _ znamená: „Tento parametr nepotřebuji.“
Dvě podtržítka máme proto, že posluchač předává dva parametry.
6.5 Proč u tlačítka podtržítka nejsou?
V aplikaci máme také:
binding.cbFork.setOnClickListener {
updatePrice()
}
Tady žádná podtržítka ani šipka nejsou.
Důvod je jednoduchý: setOnClickListener předává pouze jeden parametr – prvek, na který uživatel klikl.
Kotlin nám dovoluje u lambdy s jediným parametrem jeho zápis úplně vynechat.
Pokud bychom ho potřebovali použít, můžeme ho pojmenovat například view:
binding.cbFork.setOnClickListener { view ->
updatePrice()
}
Kotlin navíc nabízí automatický název it, který můžeme použít, když má lambda právě jeden parametr a tento parametr výslovně nepojmenujeme.
Například:
binding.cbFork.setOnClickListener {
println(it.id)
updatePrice()
}
Vypíšeme ID prvku, na který uživatel klikl, a následně přepočítáme cenu.
Protože ale v naší aplikaci parametr nepotřebujeme, stačí kratší varianta:
binding.cbFork.setOnClickListener {
updatePrice()
}
6.6 Kdy se kód uvnitř lambdy vykoná?
Podívejme se na dva podobné zápisy.
Varianta A – přímé zavolání funkce:
updatePrice()
Funkce se vykoná okamžitě, jakmile program na tento řádek narazí.
Varianta B – nastavení posluchače:
binding.cbFork.setOnClickListener {
updatePrice()
}
Tady funkci updatePrice() okamžitě nespouštíme.
Místo toho Androidu říkáme:
„Zapamatuj si tento kód a vykonej ho, až uživatel klikne na CheckBox.“
To je jeden z hlavních důvodů, proč se lambda výrazy při programování Android aplikací tak často používají.
6.7 Co si zapamatovat?
| Zápis | Význam |
|---|---|
{ println("Ahoj") } |
Lambda bez uvedených parametrů |
{ x -> println(x) } |
Lambda s jedním pojmenovaným parametrem |
{ _, _ -> updatePrice() } |
Lambda se dvěma ignorovanými parametry |
{ println(it) } |
Lambda využívající automatický název jediného parametru |
Shrnutí:
- Lambda je krátká funkce bez názvu.
- Zapisujeme ji pomocí složených závorek
{ }. - Šipka
->odděluje parametry od příkazů. - Podtržítko
_používáme pro parametry, které nepotřebujeme. itje automatický název jediného parametru lambdy.- V Androidu lambdy často používáme jako reakci na uživatelské události (kliknutí, změna výběru apod.).
6. Lambda výrazy v Kotlinu
6.1 Co vlastně dělá tento řádek?
V naší aplikaci máme tři kola, mezi kterými uživatel vybírá pomocí RadioButtonů.
Potřebujeme zajistit, aby se při každé změně výběru automaticky přepočítala cena.
K tomu slouží:
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
Přečíst si ho můžeme jednoduše:
„Když uživatel změní vybrané kolo, spusť funkci updatePrice().“
Rozložme si řádek na jednotlivé části:
| Část kódu | Co znamená |
|---|---|
binding.rgBikes |
Naše skupina tlačítek pro výběr kola |
setOnCheckedChangeListener |
Nastaví posluchače, který reaguje na změnu výběru |
{ ... } |
Kód, který se má při změně vykonat |
_, _ |
Dva parametry, které dostáváme, ale nepotřebujeme |
-> |
Odděluje parametry od příkazů |
updatePrice() |
Zavolá naši funkci pro výpočet ceny |
6.2 Co je lambda výraz (Lambda Expression)?
Lambda je funkce bez názvu, kterou můžeme napsat přímo tam, kde ji potřebujeme.
Běžnou funkci už známe:
fun pozdrav() {
println("Ahoj!")
}
Lambda může vypadat takto:
val pozdrav = {
println("Ahoj!")
}
Obě varianty mohou vykonat stejný příkaz. Rozdíl je v tom, že druhá varianta vytváří funkci bez vlastního názvu a ukládá ji do proměnné pozdrav.
V Androidu lambdy často používáme k tomu, abychom určili, co se má stát po kliknutí, změně výběru nebo jiné události.
Například:
binding.btnOrder.setOnClickListener {
println("Uživatel klikl na objednat")
}
Tím Androidu říkáme, co má vykonat, až uživatel klikne na tlačítko.
Důležité je, že příkazy uvnitř lambdy se v tomto případě nespustí okamžitě, ale až při kliknutí.
6.3 Jak vypadá lambda výraz?
Obecný zápis lambdy:
{ parametry -> příkazy }
- Složené závorky
{ }– ohraničují lambda výraz. - Parametry – informace, které lambda může dostat.
- Šipka
->– odděluje parametry od příkazů. - Příkazy – kód, který se má vykonat.
Například:
{ jmeno -> println("Ahoj, $jmeno!") }
Lambda dostane jméno a vypíše pozdrav.
Pokud lambda žádné parametry nepotřebuje, může být zápis ještě jednodušší:
{ println("Ahoj!") }
6.4 K čemu jsou podtržítka?
Vraťme se k našemu kódu:
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
Když uživatel změní výběr, Android nám automaticky předá dvě informace:
group– skupinuRadioGroup, ve které došlo ke změně.checkedId– ID nově vybranéhoRadioButtonu.
Mohli bychom tedy napsat:
binding.rgBikes.setOnCheckedChangeListener { group, checkedId ->
updatePrice()
}
Jenže my ani jednu informaci nepotřebujeme!
Naše funkce updatePrice() si totiž sama zjistí, které kolo je právě vybrané, pomocí:
binding.rgBikes.checkedRadioButtonId
Proto můžeme napsat:
binding.rgBikes.setOnCheckedChangeListener { _, _ ->
updatePrice()
}
Podtržítko _ znamená: „Tento parametr nepotřebuji.“
Dvě podtržítka máme proto, že posluchač předává dva parametry.
6.5 Proč u tlačítka podtržítka nejsou?
V aplikaci máme také:
binding.cbFork.setOnClickListener {
updatePrice()
}
Tady žádná podtržítka ani šipka nejsou.
Důvod je jednoduchý: setOnClickListener předává pouze jeden parametr – prvek, na který uživatel klikl.
Kotlin nám dovoluje u lambdy s jediným parametrem jeho zápis úplně vynechat.
Pokud bychom ho potřebovali použít, můžeme ho pojmenovat například view:
binding.cbFork.setOnClickListener { view ->
updatePrice()
}
Kotlin navíc nabízí automatický název it, který můžeme použít, když má lambda právě jeden parametr a tento parametr výslovně nepojmenujeme.
Například:
binding.cbFork.setOnClickListener {
println(it.id)
updatePrice()
}
Vypíšeme ID prvku, na který uživatel klikl, a následně přepočítáme cenu.
Protože ale v naší aplikaci parametr nepotřebujeme, stačí kratší varianta:
binding.cbFork.setOnClickListener {
updatePrice()
}
6.6 Kdy se kód uvnitř lambdy vykoná?
Podívejme se na dva podobné zápisy.
Varianta A – přímé zavolání funkce:
updatePrice()
Funkce se vykoná okamžitě, jakmile program na tento řádek narazí.
Varianta B – nastavení posluchače:
binding.cbFork.setOnClickListener {
updatePrice()
}
Tady funkci updatePrice() okamžitě nespouštíme.
Místo toho Androidu říkáme:
„Zapamatuj si tento kód a vykonej ho, až uživatel klikne na CheckBox.“
To je jeden z hlavních důvodů, proč se lambda výrazy při programování Android aplikací tak často používají.
6.7 Co si zapamatovat?
| Zápis | Význam |
|---|---|
{ println("Ahoj") } |
Lambda bez uvedených parametrů |
{ x -> println(x) } |
Lambda s jedním pojmenovaným parametrem |
{ _, _ -> updatePrice() } |
Lambda se dvěma ignorovanými parametry |
{ println(it) } |
Lambda využívající automatický název jediného parametru |
Shrnutí:
- Lambda je krátká funkce bez názvu.
- Zapisujeme ji pomocí složených závorek
{ }. - Šipka
->odděluje parametry od příkazů. - Podtržítko
_používáme pro parametry, které nepotřebujeme. itje automatický název jediného parametru lambdy.- V Androidu lambdy často používáme jako reakci na uživatelské události (kliknutí, změna výběru apod.).
Náš původní řádek:
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
tedy jednoduše znamená:
„Při každé změně vybraného kola znovu vypočítej výslednou cenu.“
binding.rgBikes.setOnCheckedChangeListener { _, _ -> updatePrice() }
tedy jednoduše znamená:
„Při každé změně vybraného kola znovu vypočítej výslednou cenu.“