В 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);
}
}
Ответы:
Лямбда - это просто конструкция сайта вызова: получателю лямбды не нужно знать, что участвует лямбда, вместо этого он принимает интерфейс с соответствующим методом.
Другими словами, вы определяете или используете функциональный интерфейс (то есть интерфейс с единственным методом), который принимает и возвращает именно то, что вы хотите.
Для этого Java 8 поставляется с набором часто используемых типов интерфейсов
java.util.function
(спасибо Морису Нафталину за подсказку о JavaDoc).Для этого используют конкретный случай есть
java.util.function.IntBinaryOperator
с одногоint applyAsInt(int left, int right)
метода , так что вы можете написать свой ,method
как это:Но вы также можете определить свой собственный интерфейс и использовать его следующим образом:
Преимущество использования собственного интерфейса заключается в том, что вы можете иметь имена, которые более четко обозначают цель.
источник
(int a, int b, int c)
заTwoArgIntOperator
. Что произойдет, еслиTwoArgIntOperator
есть два метода с одинаковой подписью. Этот ответ сбивает с толку.Чтобы использовать лямбда-выражение, вам нужно либо создать свой собственный функциональный интерфейс, либо использовать функциональный интерфейс Java для операций, которые требуют двух целых чисел и возвращают в качестве значения. IntBinaryOperator
Использование пользовательского функционального интерфейса
Использование функционального интерфейса Java
Другой пример, который я создал, здесь
источник
IntBinaryOperator
документацию мертва.Для функций, которые не имеют более 2 параметров, вы можете передавать их без определения собственного интерфейса. Например,
In
BiFunction<Integer, String, List<String>>
,Integer
иString
являются его параметрами, иList<String>
является его возвращаемым типом.Для функции, имеющей только один параметр, вы можете использовать
Function<T, R>
, гдеT
ее тип параметра и типR
возвращаемого значения. Обратитесь к этой странице для всех интерфейсов, которые уже сделаны Java.источник
Существует общедоступная веб-версия JavaDocs с поддержкой Lambda Java 8, ссылка на которую размещена по адресу http://lambdafaq.org/lambda-resources . (Очевидно, это должен быть комментарий к ответу Йоахима Сауэра, но я не могу войти в свою учетную запись SO с баллами репутации, которые мне нужны, чтобы добавить комментарий.) Сайт lambdafaq (я его поддерживаю) отвечает на этот и многие другие Java лямбда вопросов.
NB. Этот ответ был написан до того, как документация по Java 8 GA стала общедоступной . Я оставил его на месте, потому что Lambda FAQ может быть полезен для людей, которые знакомятся с функциями, представленными в Java 8.
источник
Для меня наиболее разумным решением является определение
Callback
интерфейса:а затем использовать его в качестве параметра в функции, которую вы хотите вызвать:
Просто точность, хотя
Лямбда - это не специальный интерфейс, класс или что-то еще, что вы можете объявить самостоятельно.
Lambda
это просто имя, данное() -> {}
специальному синтаксису, который обеспечивает лучшую читаемость при передаче в качестве параметра интерфейсов с одним методом. Это было разработано, чтобы заменить это:Так что в приведенном выше примере
Callback
это не лямбда, это просто обычный интерфейс;lambda
имя синтаксиса ярлыка, который вы можете использовать для его реализации.источник
Для любого, кто гуглит это, хорошим методом будет использование
java.util.function.BiConsumer
. например:Оттиск будет: 166
источник
Consumer<Pair<A,B>>
используйтеBiConsumer<A,B>
для этого случая. ( документы )Лямбда-выражение может быть передано в качестве аргумента. Чтобы передать лямбда-выражение в качестве аргумента, тип параметра (который получает лямбда-выражение в качестве аргумента) должен иметь тип функционального интерфейса.
Если есть функциональный интерфейс -
И есть метод фильтра, который добавляет int в список, только если он больше 5. Обратите внимание, что метод фильтра имеет функциональный интерфейс IMyFunc в качестве одного из параметров. В этом случае лямбда-выражение может быть передано в качестве аргумента параметра метода.
источник
Вы можете использовать функциональные интерфейсы, как указано выше. ниже приведены некоторые примеры
Надеюсь, поможет
источник
Ну, это легко. Целью лямбда-выражения является реализация функционального интерфейса. Это интерфейс только с одним методом. Вот отличная статья о предопределенных и устаревших функциональных интерфейсах.
В любом случае, если вы хотите реализовать свой собственный функциональный интерфейс, сделайте это. Просто для простого примера:
Итак, давайте создадим класс, в котором мы создадим метод, который принимает тип MyFunctionalInterface :
Последнее, что вы должны сделать, это передать реализацию MyFunctionalInterface методу, который мы определили:
Это оно!
источник
Лямбда - это не объект, а функциональный интерфейс. Можно определить столько функциональных интерфейсов, сколько они могут, используя @FuntionalInterface в качестве аннотации.
Выход будет следующим
Основная концепция лямбда-выражения заключается в определении собственной логики, но уже определенных аргументов. Таким образом, в приведенном выше коде вы можете изменить определение функции do в дополнение к любому другому определению, но ваши аргументы ограничены 2.
источник
В основном, чтобы передать выражение lamda в качестве параметра, нам нужен тип, в котором мы можем его хранить. Так же как целочисленное значение мы храним в примитиве int или классе Integer. У Java нет отдельного типа для выражения лямда, вместо этого он использует интерфейс в качестве типа для хранения аргумента. Но этот интерфейс должен быть функциональным интерфейсом .
источник
Сделайте следующее ..
Вы объявили
method(lambda l)
все, что вы хотите сделать, это создать интерфейс с именемlambda
и объявить один абстрактный методимя метода здесь не имеет значения ..
Поэтому, когда вы вызываете
MyClass.method( (a,b)->a+b)
эту реализацию, она(a,b)->a+b
будет внедрена в ваш метод add-интерфейса. Так что, когда бы вы ни вызвали ее,l.add
она возьмет эту реализацию и выполнит сложениеa
иb
иreturn l.add(2,3)
вернется5
. - В основном это то, что делает лямбда ..источник
Вот примерно как C # решает эту проблему (но выражается в виде кода Java). Нечто подобное может удовлетворить почти все ваши потребности:
источник
Существует гибкость в использовании лямбда в качестве параметра. Это позволяет функциональное программирование в Java. Основной синтаксис
Ниже приведен способ определения метода с использованием функционального интерфейса (используется лямбда). а. если вы хотите определить метод, объявленный внутри функционального интерфейса, скажем, функциональный интерфейс задается в качестве аргумента / параметра для метода, вызываемого из
main()
Выше объясняется конкретное использование лямбда-выражения, есть и другие. ref Java 8 лямбда в лямбда не может изменить переменную из внешнего лямбда
источник