Лямбда-выражения
Лямбда-выражение состоит из параметров, лямбда-операции -> и тела лямбда-выражения. Например:
Операнд -> Операнд + 1
(ПервыйПараметр, ВторойПараметр) -> ПервыйПараметр * ВторойПараметр
В программном коде значение функционального типа при записи в переменную может выглядеть следующим образом:
// Переменная функционального типа (Число) -> Число со значением x -> x * x
пер Квадрат: (Число)->Число = x -> x * x
При объявлении и вызове метода:
// Параметр ФТ — параметр функционального типа
метод Сравнить(А: Число, Б: Число, ФТ: (Число, Число)->Булево): Булево
возврат ФТ(А, Б)
;
метод Вызвать()
// 3-й аргумент — значение функционального типа (Число, Число) -> Булево
пер Равенство = Сравнить(2, 3, (x, y) -> x == y) // Ложь
пер Больше = Сравнить(2, 3, (x, y) -> x > y) // Ложь
пер Меньше = Сравнить(2, 3, (x, y) -> x < y) // Истина
;
Лямбда-выражение — анонимный метод, то есть для него не требуется указывать имя, и он не привязан к идентификатору. Анонимность и компактность лямбда-выражений позволяют записывать весь метод целиком (и параметры, и результат) непосредственно в список параметров другого метода или в тело другого метода как возвращаемое значение.
Синтаксис
Краткая форма
-
Без параметров:
() -> выражение -
Один параметр:
(параметр) -> выражение -
Один параметр с явным указанием типа:
(параметр: тип) -> выражение -
Несколько параметров:
(параметр-1, ..., параметр-N) -> выражение -
Несколько параметров с явным указанием типа:
(параметр-1: тип-1, ..., параметр-N: тип-N) -> выражение
Примеры:
метод УзнатьДату(): Строка
пер Сегодня: ()->Дата = () -> Дата.Сейчас()
возврат Сегодня().ВСтроку() // Вернет строковое представление сегодняшнего дня
;
метод ВозвестиВКвадрат(): Число
пер Квадрат: (Число)->Число = А -> А * А
возврат Квадрат(5) // 25
;
метод ФильтроватьМассивЧисел(): Массив<Число>
знч ФильтрПоложительных = (А: Число) -> А > 0
возврат [1, -2, 3, -4].Фильтровать(ФильтрПоложительных) // [1, 3]
;
метод Умножить(): Число
пер УмножитьДваЧисла: (Число, Число)->Число = (А, Б) -> А * Б
возврат УмножитьДваЧисла(4, 6) // 24
;
метод Суммировать(): Число
знч Сумматор = (А: Число, Б: Число) -> А + Б
возврат Сумматор(7, 3) // 10
;
При использовании лямбда-выражений компилятору обязательно требуется знать типы всех параметров. Если типы параметров не указаны явно и не могут быть выведены из контекста, возникнет ошибка компиляции.