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:

  1. group – skupinu RadioGroup, ve které došlo ke změně.
  2. checkedId – ID nově vybraného RadioButtonu.

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.
  • it je 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:

  1. group – skupinu RadioGroup, ve které došlo ke změně.
  2. checkedId – ID nově vybraného RadioButtonu.

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.
  • it je 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.“