Моя интерпретация лямбда-выражения в контексте C++ и Java, корректно?
Они не совсем одинаковы. Оба создают безымянные классы, но на этом их сходство заканчивается.
В C++ вы создаете замыкание, фиксирующее ваши локальные переменные, опционально по ссылке. В Java вы просто получаете снимок значений текущей локальной переменной (и эти переменные должны быть "конечными").
Цель анонимных внутренних классов - расширить другой класс или реализовать другой интерфейс ad-hoc. По этой причине анонимные внутренние классы могут в некоторой степени имитировать работу лямбда-выражений, например, реализуя интерфейс Runnable
. Лямбда-выражения специально предназначены для вызова и возможного изменения локальных переменных в своем окружении.
Анонимный внутренний класс Java может ссылаться на final
данные в включающем методе и на все данные (включая изменяемые) во включающем классе. Таким образом, методы в анонимных классах не могут изменять значения переменных в включающем методе, но они могут изменять значения членов в включающем классе.
Лямбда C ++ может ссылаться на все данные (включая изменяемые) в включающей функции, и если она вложена внутри функции-члена, то она может делать то же самое для данных включающего класса.Точная степень зависимости от охватывающей области (областей) объявляется программистом, поэтому она является явной, а не неявной.
Это делает их очень похожими, но функция Java обрабатывает локальные переменные / параметры в методах по-разному, исходя из принципа, что они не должны изменяться извне метода, особенно в языке, который традиционно так небрежно использует многопоточность.
Сравните с лямбда-выражениями C #, которые не имеют ограничений и все зависимости являются неявными. Это делает их, безусловно, наименее подробными из этих функций (чему также способствует лучший вывод типов). Но с другой стороны, они аннулируют все простые правила, касающиеся потоковой передачи, т.е. больше не обязательно верно, что локальные переменные находятся «в стеке потока» и, следовательно, никогда не требуют блокировки перед доступом.
Лямбда-выражения C ++ 0x - это безымянные методы , анонимные классы Javas - это безымянные классы . Так что у них нет имени, но концепции разные.
Начнем с самого очевидного факта, что лямбда-функции (могут) возвращать значение, а анонимные классы могут использоваться для создания экземпляров (объектов).
Кстати - википедия упоминает, что для C ++ 0x предлагаются только лямбда функции .