Создают ли лямбды в Java анонимный класс во время выполнения / выполнения?

В спецификации Java SE8 написано: Оценка лямбда-выражения производит экземпляр функционального интерфейса.

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

Может кто-нибудь подробно объяснить, что происходит во время выполнения с лямда-выражениями, которые мы пишем?


person vasseugs    schedule 21.09.2020    source источник
comment
Есть LambdaFactory, который извергает нечто большее, похожее на указатель на функцию, чем на анонимный класс. Однако для целей разработки вы можете (и должны) думать о них как о схожих; API функции существует для представления и взаимозаменяемости с сигнатурами методов   -  person Rogue    schedule 21.09.2020
comment
Ваш заголовок и тело не совпадают. Лямбда-выражения не создают новые классы во время оценки, но они могут (не всегда) вызывать их создание, и экземпляры этих анонимных классов создаются, когда выражение используется.   -  person chrylis -cautiouslyoptimistic-    schedule 21.09.2020
comment
@ chrylis-cautiouslyoptimistic- в этом вопросе точно цитируется спецификация языка. На этом языке лямбда-выражение - это argument -> body вещь, которая оценивает экземпляр функционального интерфейса, не путать с выполнением тела лямбда-выражения.   -  person Holger    schedule 29.09.2020


Ответы (1)


Нет, они этого не делают.

Механизм точного представления лямбда-выражений в среде выполнения намеренно не указан.

Все, что вы знаете, это то, что вы получите действительный объект, реализующий необходимые интерфейсы / поведение. Но помимо этого уточняется очень мало. В спецификации даже не говорится, будут ли два вызова этого объекта производить один и тот же объект или нет.

Эта расплывчатая спецификация сделана для того, чтобы компилятор и / или среда выполнения могли выполнять оптимизацию, не нарушая спецификации.

Отношения с анонимными классами более исторические: если вы хотите делать то, что делают лямбды, без использования лямбда-выражений, то анонимные классы - ваш следующий лучший инструмент.

person Joachim Sauer    schedule 21.09.2020
comment
Первая строка неточна: во многих случаях они действительно создают анонимные классы (обычно называемые такими вещами, как ContainingClass.containingMethod$lambda$1). - person chrylis -cautiouslyoptimistic-; 21.09.2020
comment
Я считаю, что это деталь реализации, и она не указана в спецификации. Кроме того, я считаю, что объект, возвращаемый лямбдой, действительно будет этого типа. - person Joachim Sauer; 21.09.2020
comment
Конечно, это не указано, но есть важное различие между тем, что не указано, и тем, что не происходит, что, безусловно, имеет место; кроме того, если лямбда записана в ссылку, она должна быть экземпляром некоторого синтетического класса. - person chrylis -cautiouslyoptimistic-; 21.09.2020
comment
Конечно, это должно быть сущность класса, но анонимный класс имеет очень конкретное значение, и это не просто какой-то синтетический класс. - person Joachim Sauer; 21.09.2020
comment
Спасибо. Я пытался найти его в некоторых книгах, но не нашел ответа, который вы дали) - person vasseugs; 21.09.2020