Анонимный внутренний класс Java может ссылаться на final
данные во включающем методе и на все данные (включая изменяемые) во включающем классе.Таким образом, методы в анонимных классах не могут изменять значения переменных во включающем методе, но они могут изменять значения членов во включающем классе.
Лямбда C ++ может ссылаться на все данные (включаяизменяемый) во включающей функции, и если он вложен в функцию-член, он может сделать то же самое для данных включающего класса.Точная степень зависимости от вмещающей области (областей) объявляется программистом, поэтому она является явной, а не неявной.
Это делает их весьма похожими, но функция Java по-разному обрабатывает локальные переменные / параметры в методах,по принципу, что они не должны быть изменяемыми извне метода, особенно в языке, который традиционно использует многопоточность так случайно.
Сравните с лямбдами C #, которые не имеют ограничений и все зависимости являются неявными.Это делает их, безусловно, наименее подробными из этих функций (также им помогают лучшие выводы типа).Но с другой стороны, они лишают законной силы все простые правила о потоке, то есть уже не обязательно верно, что локальные переменные находятся «в стеке потока» и, следовательно, никогда не требуют блокировки перед доступом.