Нет ничего сложного в преобразовании классов одного метода в указатели на функции, но вы упускаете одну вещь: лямбда-выражения - это не просто функции, они замыкания . Разница в том, что замыкания могут захватывать внешние переменные. Рассмотрим следующий пример в псевдо-Java:
public Adder makeAdder(double startNumber) {
return #{ int number -> number + startNumber}
}
...
int startNumber = 5;
Adder add5 = makeAdder(startNumber);
add5.invoke(4); // ==> 9
В этом примере лямбда-функция, созданная вызовом makeAdder (), ссылается на переменную, определенную вне этой лямбды. Вот почему это называется «замыкания» - они «закрываются» по своим свободным переменным (в данном случае - по startNumber). Для обработки таких ситуаций замыкания должны содержать как указатель на функцию, так и указатель на ее окружение . Итак, вы получаете некоторую структуру данных, которая имеет метод и хотя бы одну переменную. Но разве это не определение объекта в ООП? Так в чем же причина создания нового вида объектов, если вы можете сделать его экземпляром анонимного класса?
Тем не менее, могут быть выполнены некоторые другие оптимизации для таких анонимных классов. В рабочем документе, на который вы указали, упоминаются некоторые из них, например, вывод и эффективное использование конечных переменных (хотя это делается главным образом для того, чтобы разрешить лямбда-выражения в JVM в принципе, а не для оптимизации кода). Созданный анонимный класс также может быть сделан финальным, и большинство JVM уже имеют хорошие оптимизации для финальных переменных и классов.
Другие улучшения могут также касаться ссылок на окружающую среду - там множество вариантов.