Lambda: шта је то, синтакса и употреба у Kotlin-у

Аутор: IT Sectr Објављено: 2026-06-23 Време читања: 7 мин

Lambda — је анонимна функција представљена у облику компактног израза { аргументи -> тело }. У Kotlin-у, ламбде су основни начин преношења понашања у функције вишег реда (higher-order functions), обезбеђујући концизну синтаксу без потребе за декларисањем посебне функције. Према документацији Kotlin-а (2026), више од 70% функција вишег реда у типичним пројектима се позива са ламбдама. Lambda омогућава писање кода у функционалном стилу са минималним синтаксним шумом.

Главне тачке

  • Lambda — анонимна функција у синтакси { args -> body }, без имена
  • Неимплицитно име it замењује једини аргумент ламбде, поједностављујући запис
  • Trailing lambda — извлачење последње ламбде ван заграда позива ради читљивости
  • Захватање (closure) — ламбда може приступити променљивим из спољашњег опсега видљивости
  • Функционални тип (T) -> R дефинише потпис ламбде и проверава га компајлер

Шта је lambda?

Lambda (ламбда израз) — је анонимна функција дефинисана као израз, а не декларација. Термин потиче од ламбда рачуна Алонза Черча (1936). У програмирању, ламбда представља блок кода који се може пренети као вредност, сачувати у променљивој и позвати касније. У Kotlin-у, ламбда је увек затворена у витичасте заграде { }, аргументи су одвојени од тела стрелицом ->.

Ламбда се разликује од обичне функције по одсуству имена и кључне речи fun. Ово омогућава декларисање понашања директно на месту употребе, без затрпавања кода додатним декларацијама. Компајлер Kotlin-а изводи типове аргумената из контекста, па се у многим случајевима типови могу изоставити. Ламбда је синтаксни шећер над функционалним типом (T) -> R: свака ламбда има одговарајући функционални тип.

Основна примена ламбди у Kotlin-у је преношење у функције вишег реда (higher-order functions). Стандардна библиотека користи ламбде свуда: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Ламбде се такође користе за креирање ослушкивача догађаја, повратних позива, конфигуратора објеката кроз apply и run, што чини код декларативнијим у поређењу са анонимним класама.

Синтакса ламбда израза у Kotlin-у

Потпуни облик ламбда израза у Kotlin-у: { аргументи -> тело_ламбде }. Аргументи се набрајају са зарезом, затим следи стрелица и тело — један или више израза. Ако тело садржи више редова, последњи израз постаје повратна вредност. Ако функција прихвата ламбду као последњи аргумент, она се може извући ван заграда позива.

kotlin
val sum: (Int, Int) -> Int = { a, b -> a + b }

// Типови изведени из контекста
val sumShort = { a: Int, b: Int -> a + b }

// Позив ламбде
val result = sum(5, 3)  // 8
println(result)

Променљива sum је декларисана са експлицитним функционалним типом (Int, Int) -> Int и иницијализована ламбдом { a, b -> a + b }. За sumShort типови су наведени унутар ламбде, а тип променљиве је изведен. Обе варијанте су еквивалентне. Позивање ламбде се не разликује од позивања обичне функције — користи се синтакса sum(5, 3). Ламбда без аргумената се пише као { body }, са једним аргументом — { it -> it * 2 } или једноставно { it * 2 }.

Неимплицитно име it и изостављање аргумената

Када ламбда прихвата тачно један аргумент, Kotlin обезбеђује неимплицитно име it. Ово елиминише потребу за декларисањем аргумента са леве стране. Програмер пише само тело ламбде, користећи it за приступ једином параметру. Оваква синтакса је посебно згодна у ланцима обраде колекција, где it означава тренутни елемент.

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

// Експлицитно име параметра
val squaredExplicit = numbers.map { n -> n * n }

// Имплицитно it
val squared = numbers.map { it * it }

// Филтрирање са it
val even = numbers.filter { it % 2 == 0 }

println(squared) // [1, 4, 9, 16, 25]

У примеру map { it * it } користи се it уместо декларације n ->. Kotlin аутоматски додељује it за једини параметар ламбде. Ако ламбда прихвата два или више аргумената, it се не креира — потребно је експлицитно декларисати све параметре. Ради боље читљивости угњеждених ламбди, препоручује се давање смислених имена параметрима, а it користити у кратким једноредним предикатима.

Trailing lambda и вишелинијске ламбде

Trailing lambda (завршна ламбда) — синтаксна карактеристика Kotlin-а која омогућава извлачење последњег аргумента-ламбде ван округлих заграда позива функције. Ово чини код сличним уграђеним језичким конструкцијама. Ако је ламбда једини аргумент, заграде се могу потпуно изоставити. Овај приступ се активно користи у стандардној библиотеци и DSL-у.

kotlin
// Стандардни позив
thread(block = {
    println("Здраво из нити")
})

// Верзија са trailing lambda
thread {
    println("Здраво из нити")
}

// repeat са trailing lambda
repeat(3) { index ->
    println("Итерација $index")
}

// run са вишелинијском ламбдом
val config = run {
    val host = "localhost"
    val port = 8080
    "$host:$port"
}

Функција thread прихвата Runnable као последњи аргумент. Захваљујући trailing lambda, ламбда се може пренети ван заграда, што визуелно подсећа на блок кода. Функција repeat прихвата број итерација и ламбду са индексом. run — пример функције вишег реда где вишелинијска ламбда израчунава вредност коју враћа последњи израз. Заграде око run() се могу изоставити ако је ламбда једини аргумент.

Захватање променљивих (closure) у ламбдама

Захватање променљивих (closure) — способност ламбде да приступи променљивим декларисаним у спољашњем опсегу видљивости. У Kotlin-у, ламбда може читати и мењати var променљиве, као и читати val променљиве из окружујућег контекста. Захваћене променљиве се чувају заједно са ламбдом током целог њеног животног циклуса, што омогућава креирање функција са стањем.

kotlin
fun makeCounter(): () -> Int {
    var count = 0
    return {
        count++  // број захватања
    }
}

fun main() {
    val counter = makeCounter()
    println(counter()) // 0
    println(counter()) // 1
    println(counter()) // 2
}

Функција makeCounter декларише локалну променљиву count и враћа ламбду { count++ }. Иако је makeCounter завршила рад, враћена ламбда задржава референцу на count кроз затворење. Сваки позив counter() повећава и враћа тренутну вредност. Механизам closure лежи у основи карирања, фабрика функција и мемоизације. Важно је запамтити да захватање променљивих променљивих може довести до неочекиваног понашања при паралелном извршавању.

Често постављана питања

Може ли ламбда имати return?

Ламбда не подржава безусловни return — return без ознаке враћа контролу спољашњој функцији. За излазак из ламбде користите return@label, где је label име функције вишег реда којој је ламбда прослеђена.

Која је разлика између ламбде и анонимне функције?

Анонимна функција се пише као fun(a: Int): Int { return a * 2 } и подржава return без ознаке. Ламбда { a -> a * 2 } је краћа синтаксно, али захтева return@label за рани излаз.

Како проследити ламбду као аргумент без стрелице?

Ако ламбда не прихвата аргументе, стрелица се изоставља: { body() }. Ако прихвата један аргумент и не користи га, уместо стрелице се пише { _ -> body() } са доњом цртом за игнорисање параметра.

Да ли ламбда увек креира нови објекат?

Да, свака ламбда прослеђена non-inline функцији креира инстанцу анонимне класе. За inline функције, ламбда се убацује на месту позива без креирања објекта. Non-capturing ламбде се кеширају у singleton објекте.

Зашто се у ламбди не може користити return директно?

Return у Kotlin-у је оператор скока који припада најближој функцији са fun. Ламбда није функција (fun), већ израз. Стога се return унутар ламбде без ознаке сматра повратком из спољашње обухватајуће функције.

Закључак

  • Lambda — анонимна функција у синтакси { args -> body }, прослеђена као вредност функцији вишег реда
  • Неимплицитно име it замењује једини аргумент и чини код компактнијим у кратким предикатима
  • Trailing lambda извлачи последњу ламбду ван заграда позива ради читања као блок кода
  • Захватање (closure) омогућава ламбди приступ променљивим из спољашњег контекста након завршетка обухватајуће функције
  • Функционални тип (T) -> R дефинише потпис ламбде са провером у фази компилације
  • Inline функције елиминишу креирање анонимних класа за ламбде, повећавајући перформансе у петљама
  • Вишелинијске ламбде враћају вредност последњег израза, подржавајући сложена израчунавања без декларисања посебне функције

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође