Дополнительно
Как определить метод, который принимает лямбду в качестве параметра в Java 8?
В Java 8 методы могут быть созданы как лямбда-выражения и могут передаваться по ссылке (с небольшой работой под капотом). В Интернете можно найти множество примеров создания и использования лямбд с методами, но нет примеров того, как сделать метод, принимающий лямбду в качестве параметра. Каков синтаксис для этого?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
326
13
Лямбды - это чисто конструкция места вызова: получателю лямбды не нужно знать, что в ней участвует лямбда, вместо этого он принимает интерфейс с соответствующим методом.
Другими словами, вы определяете или используете функциональный интерфейс (т.е. интерфейс с одним методом), который принимает и возвращает именно то, что вы хотите.
Для этого Java 8 поставляется с набором часто используемых типов интерфейсов в
java.util.function
(спасибо Maurice Naftalin за подсказку о JavaDoc).Для этого конкретного случая использования есть
java.util.function.IntBinaryOperator
с единственным методомint applyAsInt(int left, int right)
, так что вы можете написать свойметод
следующим образом:Но вы также можете определить свой собственный интерфейс и использовать его следующим образом:
Использование собственного интерфейса имеет то преимущество, что вы можете иметь имена, которые более четко указывают на намерение.
Для использования лямбда-выражения необходимо либо создать свой собственный функциональный интерфейс, либо использовать функциональный интерфейс Java для операций, которые требуют два целых числа и возврата в качестве значения. IntBinaryOperator
Использование функционального интерфейса, определенного пользователем
Использование функционального интерфейса Java
Другой пример, который я создал, находится здесь.
Для функций, которые не имеют более 2-х параметров, вы можете пройти их без определения собственного интерфейса. Например,
В
BiFunction<целое число, строка, список<строка>>
,целое
истрока
являются его параметры, и список<строка> у` - ее возвращаемый тип.Для функции с одним параметром, вы можете использовать
функция<Т, R>
, гдеТ
- это параметр типа, иР
является его тип возвращаемого значения. Обратитесь к этой страничке [] (https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html) для всех интерфейсов, которые уже доступны в Java.Существует общедоступная веб-версия Java 8 JavaDocs с поддержкой Lambda, ссылка на которую находится по адресу http://lambdafaq.org/lambda-resources. (Очевидно, это должен быть комментарий к ответу Joachim Sauer', но я не могу войти в свой аккаунт на SO с очками репутации, необходимыми для добавления комментария). Сайт lambdafaq (я его поддерживаю) отвечает на этот и многие другие вопросы по Java-lambda.
NB Этот ответ был написан до того, как документация по Java 8 GA стала общедоступной. Однако я оставил его на месте, поскольку Lambda FAQ все еще может быть полезен людям, изучающим возможности, появившиеся в Java 8.
Для тех, кто погуглил этого, хорошим методом будет использование
Ява.утиль.функция.BiConsumer
. экс:В outprint будет: 166
Для меня, решение, которое наиболее логично определить интерфейс обратного вызова :
и затем использовать его в качестве параметра в функции вы хотите позвонить :
Просто в точности, хотя
Лямбда-это не специальный интерфейс, класс или что-нибудь еще вы могли бы заявить о себе. "Лямбда" - это просто название, данное
() -> {}
специальный синтаксис, который позволяет лучше читаемость при прохождении одного метода интерфейса в качестве параметра. Она была разработана, чтобы заменить это :Так в приведенном выше примере
обратного вызова
это не лямбда, это's просто обычный интерфейс ;лямбда
- имя синтаксис ярлыка можно использовать для его реализации.Лямбда-выражение может быть передан в качестве аргумента.Чтобы передать лямбда-выражение в качестве аргумента тип параметра (который принимает лямбда-выражение в качестве аргумента) должен быть функциональный тип интерфейса.
Если есть функциональный интерфейс -
И есть метод filter, который добавляет инт в списке, только если она превышает 5. Здесь следует отметить, что метод фильтрации имеет funtional IMyFunc интерфейс в качестве одного из параметров. В этом случае лямбда-выражение может быть передана в качестве аргумента для параметра метод.
Вы можете использовать функциональные интерфейсы, как упоминалось выше. ниже приведены некоторые примеры
Надеюсь, что это помогает
Хорошо, что's легко. Цель лямбда-выражение является реализация функционального интерфейса. Это интерфейс с одним методом. Здесь каждый статьи о стандартных и устаревших функциональных интерфейсов.
В любом случае, если вы хотите реализовать свой собственный функциональный интерфейс, сделать его. Просто на простом примере:
Так давайте's сделать класс, где мы создадим метод, который принимает тип MyFunctionalInterface :
Последняя вещь, которую вы должны сделать, это пройти осуществлении MyFunctionalInterface метод мы'вэ определено:
Что's это!
Лямда-это не объект, но функциональный интерфейс. Можно определить как функциональные интерфейсы, как они могут с помощью @FuntionalInterface в качестве аннотации
Вывод будет следующим образом
Основная концепция лямбда-выражения, чтобы определить собственную логику, но уже определенными аргументами. Так в приведенном выше коде вы можете изменить описание функции дополнение к любому другому определению, но ваши аргументы ограничиваются 2.
В основном, чтобы пройти лямбда выражения в качестве параметра, нам нужен тип, в котором мы можем его удержать. Просто как целочисленное значение, мы держим в первобытном инт или целого класса. Ява не'т иметь отдельный вид для выражения лямбда вместо этого он использует интерфейс как тип, чтобы держать аргумент. Но, что интерфейс должен быть функциональный интерфейс.
Выполните следующие действия ..
Вы объявили метод(лямда-л)` Все, что вы хотите сделать, это создать интерфейс с именем "лямбда" и объявить один абстрактный метод
имя метода не имеет значения здесь..
Поэтому, когда ты называешь класса MyClass
.способ( (А,B)->а+B)
Эта реализация(а,б)->а+B
будет введен в ваш интерфейс метод Add .Поэтому, когда вы называете я.добавитьэто собирается занять эту реализацию и выполнять сложение
Aи
Bи
возвращение л.добавить(2,3)вернет
5`.Существует гибкость в использовании лямбда-выражение в качестве параметра. Это дает возможность функционального программирования в Java. Базовый синтаксис
Ниже приведен способ, можно определить способ принятия функциональный интерфейс (используется лямбда) в качестве параметра. а. если вы хотите определить метод, объявленный внутри функциональный интерфейс, скажем, функциональный интерфейс приведен как аргумент/параметр в метод вызывается из основной()`
Выше объясняет особенности использования лямбда-выражения, есть более. Реф https://stackoverflow.com/questions/23451579/java-8-lambda-within-a-lambda-cant-modify-variable-from-outer-lambda