Понимание «лямбда-выражений» в Java в контексте «лямбда-выражений» и «анонимных классов» - PullRequest
0 голосов
/ 29 октября 2018

Я прочитал довольно много материала о лямбде. Но их тонкие сомнения:

Q1. Определение лямбда-выражений.

  1. Я не нашел четкого определения на странице оракула .
  2. Эта ссылка говорит: «Таким образом, лямбда-выражение Java - это функция, которая может быть создана без принадлежности к какому-либо классу».
  3. Эта ссылка гласит: «Лямбда-выражение - это краткое представление анонимной функции, которую можно передавать».
  4. Эта ссылка говорит "Лямбда-выражения в основном выражают экземпляры функциональных интерфейсов"

2-я и 3-я ссылки ничего не говорят о функциональных интерфейсах. Четвертая ссылка звучит несколько неплохо, но в ней не указывается «анонимный» аспект лямбда-выражений. Можем ли мы определить их более точно так:

Лямбда выражений"синтаксически лаконичные выражения для определения анонимных реализаций функциональных интерфейсов".

Я полагаю, что определения слова «функциональный интерфейс» в определении должно быть достаточно, чтобы утверждать, что мы реализуем его единственный метод, и он ведет себя как функция, а не класс, даже если это анонимные классы.

Q2. Различаем ли мы лямбда-выражения и лямбда-выражения?

Я чувствую, что есть разница, потому что лямбда-выражения могут использоваться для определения как лямбда-выражения, которые не имеют состояния, так и замыканий, которые являются состоящими (то есть переменные доступа во внешней лексической области видимости). Похоже, именно поэтому оракуловая ссылка не использует слово «лямбда» без «выражения». Однако это не относится к другим ссылкам.

Q3. Эта ссылка говорит с лямбда-выражениями: «Нам не нужно писать много шаблонов, как мы делаем для анонимных классов». Теперь это звучит так: «Лямбда-выражения похожи на анонимные классы, это просто так», «нам не нужно писать много шаблонов, как мы делаем для анонимных классов». Я чувствую, что мы не можем напрямую сравнивать лямбда-выражения с анонимными классами, поскольку основное отличие заключается в том, что концепт анонимного класса не связан с функциональными интерфейсами, тогда как лямбда-выражения строго имеют дело с функциональными интерфейсами. Таким образом, у анонимных классов может быть любое количество методов, но лямбда-выражения могут определять только один метод. Я прав с этим?

1 Ответ

0 голосов
/ 29 октября 2018

Для вопроса 1, да, вы можете определить это так для повседневных целей. Но под капотом лямбда-выражения являются синтаксическим сахаром для старых добрых методов. Смотрите эту ссылку . Тело лямбды преобразуется в статический метод, и есть инструкция invokedynamic.

Что касается вопроса 2, то, насколько я понимаю, «лямбда» в данном контексте является просто сокращением от «лямбда-выражения». Вы не хотели бы такого длинного слова в разговорной речи, верно? В других контекстах «лямбда» может относиться к греческой букве λ.

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

...