Лямбда-выражения в Kotlin

Лямбда-выражение в Kotlin -- это, по сути, функция без названия. Данное выражение можно присвоить переменной и передавать в качестве любого другого значения. Давайте посмотрим, насколько полезными и удобными бывают лямбды.

Введение в лямбда

Кроме вышесказанного, лямбда известна и как анонимная функция, получившая название от лямбда-исчисления А. Черча, где все функции анонимны. А еще лямбда -- это синоним замыкания (closures). Собственно говоря, лямбда-выражения применяются и в прочих языках программирования, к примеру, в том же Python.

Говоря о замыканиях, следует сказать, что они способны «закрывать» константы и переменные в пределах своей области видимости. Что это значит? Ну, например, то, что лямбда способна получать доступ, а также сохранять и управлять значением любой переменной/константы из окружающего контекста, то есть она действует в качестве вложенной функции. Принято считать, что константы и переменные, применяемые в теле лямбда-выражения, «захвачены» лямбдой.

Может возникнуть резонный вопрос: если лямбды -- это функции без названий, то как с ними работать на практике? На деле, для применения лямбда-выражения надо сначала присвоить это выражение переменной либо константе, причем сделать это можно и в качестве аргумента другой функции.

Объявим переменную, которая способна содержать лямбду:

Итак, наша Lambda multiplyLambda принимает 2 значения типа Int, а также возвращает Int. Следует обратить внимание, что это, по сути, то же самое, что и объявление переменной для функции (опять же, вспоминаем, что лямбда — это всего лишь функция без названия). При этом типом лямбды будет тип функции.

Лямбда присваивается переменной так:

Это напоминает объявление функции, но есть нюансы. Да, здесь такой же перечень параметров, однако символ -> указывает на тип возвращаемого значения. При этом тело лямбды у нас начинается после возвращаемого типа. Также следует добавить, что Lambda-выражение возвращает значение последнего выражения в теле.

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

Итак, lambdaResult равен 8. Но и тут есть нюанс: лямбда не позволяет применять названия для аргументов. То есть вы не сможете написать multiplyLambda(a = 4, b = 2). То есть, в отличие от стандартных функций, у вас нет возможности применять при вызове лямбды именованные аргументы.

По материалам сайта https://kotlins.org/.