Лямбда выражения и анонимные функции

Лямбда выражения и анонимные функции

Лямбда выражения и анонимные функции являются "литералами фунций", которые не объявлены, но переданы как выражения.

Лямбда выражения пишутся внутри блока (начинаются с { и заканчиваются }). Параметры пишутся внутри блока и по желанию можно указать также тип параметров затем пишется символ -> и код для выполнения. После -> можно указать возвращаемый выражением тип и если тип возвращаемых данных не является Unit, в таком случае в качестве значения для возвращения используется последняя строка кода в лямбда выражении:

var a = { f: Int, d : Int -> Unit
    println(f+d) // Вывести в консоль сумму значений параметров
}
Выполнить лямбда присвоенное переменной можно вызвав функцию invoke и передав необходимые параметры:
a.invoke(40, 50) // 90

Пример возвращения значения значения:

Объявляется лямбда получающее два значения и возвращающее значение типа Int. После указания типа необходимо поставить абзац или написать ; для разрыва строки:

val g = { f:Int, s : Int -> Int
    f+s
}
val d = g.invoke(10,20) // Выполнить лямбду и присвоить результат переменной d
println("D is $d") // Вывести значение переменной d в консоль: D is 30

Когда лямбда передаётся в качестве последнего параметра функции, при вызове функции его можно написать после скобок "()". Если лямбда принимает один параметр и в начале лямбды если его не писать компилятор подставляет вместо параметра ключевое слово it.

Объявляем функцию, которая принимает два параметра. Первый имеет тип Int второй лямбда выражение:

fun lambdaTest(param : Int, l : (Int) -> Int)
{
    // Выполняем код лямбда и полученный результат присваиваем локальной переменной
    val result = l.invoke(param)
    // Вывести результат полученный выполнением лямбда выражения в консоль
    println(result)
}

Передав первый параметр (передаётся значение 10), лямбда можно за пределами скобок функции написать:

lambdaTest(10) {
    // Так как лямбда принимает только один параметр типа Int, его можно не писать и компилятор вместо него подставляет ключевое слово it. Лямбда состоит из одной строки, которая возвращается как результат выполнения, так как лямбда в сигнатуре функции объявляется как лямбда которая принимает один параметр и возвращает результат с типом Int (целое число)
    it + 20
}
Лямбда выражения также можно использовать в качестве обработчиков событий, например для обработки события нажатия на кнопку и код, который необходимо выполнить передаётся в качестве лямбда выражения:
btn.setOnClickListener {
    println((it as Button).text)
}