Недавно я освоил лямбда-выражение, которое было введено в java 8. Я обнаружил, что всякий раз, когда я использую функциональный интерфейс, я склонен всегда использовать лямбда-выражение вместо создания класса, реализующего функциональный интерфейс.
Это считается хорошей практикой? Или их ситуации, когда использование лямбды для функционального интерфейса не подходит?
Ответы:
Существует ряд критериев, которые следует учитывать при использовании лямбды:
priceIsOver100
.x -> x.price > 100
так же ясно, как это имя. Я имею в виду такие имена,isEligibleVoter
которые заменяют длинный список условий.Не уходи за борт. Помните, программное обеспечение легко меняется. Если сомневаетесь, напишите обоими способами и посмотрите, что легче читать.
источник
По-разному. Всякий раз, когда вы обнаруживаете, что используете одну и ту же лямбду в разных местах, вам следует подумать о реализации класса, реализующего интерфейс. Но если бы вы использовали анонимный внутренний класс, иначе я думаю, что лямбда гораздо лучше.
источник
Я поддерживаю ответ Карла Билефельдта, но хочу дать краткое дополнение.
источник
Доступ к локальным переменным вмещающей области
Принятый ответ Карла Билефельдта правильный. Я могу добавить еще одно различие:
Лямбда-код, вложенный в метод внутри класса, может получить доступ к любым эффективно- конечным переменным, найденным в этом методе и классе.
Создание класса, реализующего функциональный интерфейс, не дает вам такого прямого доступа к состоянию вызывающего кода.
Чтобы процитировать Java Tutorial (курсив мой):
Таким образом, несмотря на преимущества извлечения длинного кода и присвоения ему имен, вы должны сравнить это с простотой прямого доступа к состоянию включающего метода и класса.
Видеть:
источник
Это может быть придиркой, но ко всем другим замечательным замечаниям, высказанным в других ответах, я бы добавил:
Предпочитайте ссылки на метод, когда это возможно. Для сравнения:
против
Использование ссылки на метод избавляет вас от необходимости называть лямбда-аргумент (ы), который обычно избыточен и / или приводит к ленивым именам, таким как
e
илиx
.источник
Основываясь на ответе Мэтта МакГенри, между лямбдой и ссылками на методы может существовать связь, где лямбда может быть переписана в виде серии ссылок на методы. Например:
против
источник