Понимание лямбда-выражений в Java в контексте лямбда-выражений и анонимных классов

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

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

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

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

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

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

Вопрос 2. Есть ли различие между лямбда-выражениями и лямбда-выражениями?

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

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


person anir    schedule 29.10.2018    source источник
comment
Если у вас есть три вопроса, задайте три целенаправленных вопроса. Например, сделать три поста. Не смешивайте все в одну кучу только потому, что это одна и та же тема.   -  person Michael    schedule 29.10.2018
comment
Q1) docs.oracle.com/javase/tutorial/java/javaOO/ Q2) Нет Q3) Не вопрос. Они очень похожи, так как оба выполняют одну и ту же роль передачи функций в качестве аргументов. Почти каждый анонимный класс с одним методом должен быть преобразован в лямбду.   -  person Michael    schedule 29.10.2018
comment
Q1) Определение лямбда-выражений Q2) Другие ссылки не являются официальными документами. Q3) Вы можете написать каждое лямбда-выражение как анонимный внутренний класс. И это имеет гораздо больше шаблонов. И если мы МОЖЕМ использовать лямбда-выражения, это экономит много шаблонного кода.   -  person Johannes Kuhn    schedule 29.10.2018


Ответы (1)


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

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

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

person Sweeper    schedule 29.10.2018