No Java 8, os métodos podem ser criados como expressões Lambda e podem ser passados por referência (com um pouco de trabalho oculto). Existem muitos exemplos online, com lambdas sendo criadas e usadas com métodos, mas não há exemplos de como criar um método usando um lambda como parâmetro. Qual é a sintaxe para isso?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Respostas:
Lambdas são puramente uma construção de site de chamada: o destinatário do lambda não precisa saber que um Lambda está envolvido; em vez disso, ele aceita uma interface com o método apropriado.
Em outras palavras, você define ou usa uma interface funcional (ou seja, uma interface com um único método) que aceita e retorna exatamente o que deseja.
Para isso, o Java 8 vem com um conjunto de tipos de interface comumente usados
java.util.function
(obrigado a Maurice Naftalin pela dica sobre o JavaDoc).Para este caso de uso específico não
java.util.function.IntBinaryOperator
com um únicoint applyAsInt(int left, int right)
método , assim que você pode escrever seumethod
parecido com isto:Mas você também pode definir sua própria interface e usá-la assim:
O uso de sua própria interface tem a vantagem de poder ter nomes que indicam mais claramente a intenção.
fonte
(int a, int b, int c)
paraTwoArgIntOperator
. O que acontece seTwoArgIntOperator
tiver dois métodos com a mesma assinatura. Esta resposta é confusa.Para usar a expressão Lambda, você precisa criar sua própria interface funcional ou usar a interface funcional Java para operação que requer dois números inteiros e retorna como valor. IntBinaryOperator
Usando interface funcional definida pelo usuário
Usando interface funcional Java
Outro exemplo que eu criei está aqui
fonte
IntBinaryOperator
documentação está morto.Para funções que não possuem mais de 2 parâmetros, você pode transmiti-las sem definir sua própria interface. Por exemplo,
In
BiFunction<Integer, String, List<String>>
,Integer
eString
são seus parâmetros eList<String>
é seu tipo de retorno.Para uma função com apenas um parâmetro, você pode usar
Function<T, R>
, ondeT
é o tipo de parâmetro eR
o tipo de valor de retorno. Consulte esta página para todas as interfaces que já são disponibilizadas pelo Java.fonte
Há uma versão pública acessível pela Web dos JavaDocs Java 8 habilitados para Lambda, vinculados em http://lambdafaq.org/lambda-resources . (Obviamente, isso deve ser um comentário sobre a resposta de Joachim Sauer, mas não consigo entrar na minha conta SO com os pontos de reputação que preciso adicionar um comentário.) O site lambdafaq (eu o mantenho) responde a esse e muitos outros Java perguntas -ambda.
Nota: esta resposta foi escrita antes da documentação do Java 8 GA ser disponibilizada ao público . Eu deixei o local, porém, porque as Perguntas frequentes sobre o Lambda ainda podem ser úteis para as pessoas que aprendem sobre os recursos introduzidos no Java 8.
fonte
Para mim, a solução que faz mais sentido é definir uma
Callback
interface:e depois usá-lo como parâmetro na função que você deseja chamar:
Apenas uma precisão
Um lambda não é uma interface especial, classe ou qualquer outra coisa que você possa declarar por si mesmo.
Lambda
é apenas o nome dado à() -> {}
sintaxe especial, que permite melhor legibilidade ao passar interfaces de método único como parâmetro. Foi projetado para substituir isso:Portanto, no exemplo acima, não
Callback
é um lambda, é apenas uma interface regular; é o nome da sintaxe de atalho que você pode usar para implementá-lo.lambda
fonte
Para quem está pesquisando no Google, um bom método seria usar
java.util.function.BiConsumer
. ex:A impressão seria: 166
fonte
Consumer<Pair<A,B>>
, useBiConsumer<A,B>
para este caso. ( docs )A expressão lambda pode ser passada como argumento.Para passar uma expressão lambda como argumento, o tipo do parâmetro (que recebe a expressão lambda como argumento) deve ser do tipo de interface funcional.
Se houver uma interface funcional -
E existe um método de filtro que adiciona o int na lista somente se for maior que 5. Observe aqui que o método de filtro possui a interface funcional IMyFunc como um dos parâmetros. Nesse caso, a expressão lambda pode ser transmitida como um argumento para o parâmetro do método
fonte
Você pode usar interfaces funcionais como mencionado acima. abaixo estão alguns dos exemplos
Espero que ajude
fonte
Bem, isso é fácil. O objetivo da expressão lambda é implementar a Interface Funcional. É a interface com apenas um método.Aqui está um artigo impressionante sobre interfaces funcionais predefinidas e herdadas.
De qualquer forma, se você deseja implementar sua própria interface funcional, faça-a. Apenas para um exemplo simples:
Então, vamos criar uma classe, onde criaremos um método, que aceita o tipo de MyFunctionalInterface :
A última coisa que você deve fazer é passar a implementação do MyFunctionalInterface para o método que definimos:
É isso aí!
fonte
O Lambda não é um objeto, mas uma Interface Funcional. Pode-se definir o máximo de interfaces funcionais usando o @FuntionalInterface como uma anotação
A saída será a seguinte
O conceito básico de uma expressão lambda é definir sua própria lógica, mas os argumentos já definidos. Portanto, no código acima, você pode alterar a definição da função do para outra definição, mas seus argumentos são limitados a 2.
fonte
Basicamente, para passar uma expressão lamda como parâmetro, precisamos de um tipo no qual possamos mantê-la. Assim como um valor inteiro, mantemos a classe primitiva int ou Integer. Java não tem um tipo separado para expressão lamda, em vez disso, usa uma interface como o tipo para conter o argumento. Mas essa interface deve ser uma interface funcional .
fonte
Faça o seguinte ..
Você declarou
method(lambda l)
Tudo que deseja fazer é criar uma interface com o nomelambda
e declarar um método abstratonome do método não importa aqui ..
Então, quando u chamar
MyClass.method( (a,b)->a+b)
Esta implementação(a,b)->a+b
será injetado para o seu método de interface add .Assim sempre que você chamarl.add
ele vai levar essa implementação e realizar adição dea
eb
ereturn l.add(2,3)
irá retornar5
. - Basicamente é isso que o lambda faz ..fonte
Aqui está mais ou menos como o C # lida com esse problema (mas expresso como código Java). Algo assim poderia lidar com quase todas as suas necessidades:
fonte
Há flexibilidade no uso de lambda como parâmetro. Permite programação funcional em java. A sintaxe básica é
A seguir, é possível definir um método usando a interface funcional (lambda é usado) como parâmetro. uma. se você deseja definir um método declarado dentro de uma interface funcional, por exemplo, a interface funcional é fornecida como argumento / parâmetro para um método chamado from
main()
Acima explica um uso específico da expressão lambda, há mais. ref O Java 8 lambda dentro de um lambda não pode modificar a variável do lambda externo
fonte