En Java 8, los métodos se pueden crear como expresiones Lambda y se pueden pasar por referencia (con un poco de trabajo bajo el capó). Hay muchos ejemplos en línea con lambdas que se crean y usan con métodos, pero no hay ejemplos de cómo hacer que un método tome una lambda como parámetro. ¿Cuál es la sintaxis para eso?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Respuestas:
Las lambdas son puramente una construcción de sitio de llamada: el destinatario de la lambda no necesita saber que una Lambda está involucrada, sino que acepta una interfaz con el método apropiado.
En otras palabras, usted define o utiliza una interfaz funcional (es decir, una interfaz con un único método) que acepta y devuelve exactamente lo que desea.
Para esto, Java 8 viene con un conjunto de tipos de interfaz de uso común en
java.util.function
(gracias a Maurice Naftalin por la pista sobre JavaDoc).Para este caso de uso específico no
java.util.function.IntBinaryOperator
con un soloint applyAsInt(int left, int right)
método , por lo que podría escribir sumethod
siguiente manera:Pero también puede definir su propia interfaz y usarla así:
El uso de su propia interfaz tiene la ventaja de que puede tener nombres que indican más claramente la intención.
fuente
(int a, int b, int c)
porTwoArgIntOperator
. Lo que sucede siTwoArgIntOperator
tiene dos métodos con la misma firma. Esta respuesta es confusa.Para usar la expresión de Lambda, debe crear su propia interfaz funcional o usar la interfaz funcional de Java para operaciones que requieren dos enteros y devolver como valor. IntBinaryOperator
Usando la interfaz funcional definida por el usuario
Usando la interfaz funcional Java
Otro ejemplo que he creado está aquí.
fuente
IntBinaryOperator
documentación está muerto.Para funciones que no tienen más de 2 parámetros, puede pasarlos sin definir su propia interfaz. Por ejemplo,
En
BiFunction<Integer, String, List<String>>
,Integer
yString
son sus parámetros, yList<String>
es su tipo de retorno.Para una función con un solo parámetro, puede usar
Function<T, R>
, dondeT
es su tipo de parámetro yR
es su tipo de valor de retorno. Consulte esta página para ver todas las interfaces que ya están disponibles en Java.fuente
Hay una versión pública accesible desde la Web de JavaDocs Java 8 habilitados para Lambda, enlazada desde http://lambdafaq.org/lambda-resources . (Obviamente, esto debería ser un comentario sobre la respuesta de Joachim Sauer, pero no puedo ingresar a mi cuenta SO con los puntos de reputación que necesito para agregar un comentario.) El sitio lambdafaq (lo mantengo) responde esto y muchos otros Java -lambda preguntas.
Nota: esta respuesta se escribió antes de que la documentación de Java 8 GA estuviera disponible públicamente . Sin embargo, me he quedado en su lugar, porque las preguntas frecuentes de Lambda aún pueden ser útiles para las personas que aprenden sobre las características introducidas en Java 8.
fuente
Para mí, la solución que tiene más sentido es definir una
Callback
interfaz:y luego usarlo como parámetro en la función que desea llamar:
Solo una precisión
Una lambda no es una interfaz especial, clase o cualquier otra cosa que pueda declarar usted mismo.
Lambda
es solo el nombre dado a la() -> {}
sintaxis especial, que permite una mejor legibilidad al pasar interfaces de un solo método como parámetro. Fue diseñado para reemplazar esto:Entonces, en el ejemplo anterior, no
Callback
es una lambda, es solo una interfaz normal; es el nombre de la sintaxis de acceso directo que puede usar para implementarlo.lambda
fuente
Para cualquiera que esté buscando en Google esto, un buen método sería usarlo
java.util.function.BiConsumer
. ex:El outprint sería: 166
fuente
Consumer<Pair<A,B>>
usarBiConsumer<A,B>
para este caso. ( docs )La expresión lambda se puede pasar como argumento. Para pasar una expresión lambda como argumento, el tipo de parámetro (que recibe la expresión lambda como argumento) debe ser de tipo de interfaz funcional.
Si hay una interfaz funcional,
Y hay un método de filtro que agrega el int en la lista solo si es mayor que 5. Observe aquí que el método de filtro tiene una interfaz funcional IMyFunc como uno de los parámetros. En ese caso, la expresión lambda se puede pasar como argumento para el parámetro del método.
fuente
Puede usar interfaces funcionales como se mencionó anteriormente. a continuación se presentan algunos de los ejemplos
Espero eso ayude
fuente
Bueno, eso es facil. El propósito de la expresión lambda es implementar la interfaz funcional. Es la interfaz con un solo método. Aquí hay un artículo impresionante sobre interfaces funcionales predefinidas y heredadas.
De todos modos, si desea implementar su propia interfaz funcional, hágalo. Solo por simple ejemplo:
Entonces, hagamos una clase, donde crearemos un método, que acepte el tipo de MyFunctionalInterface :
Lo último que debe hacer es pasar la implementación de MyFunctionalInterface al método que hemos definido:
¡Eso es!
fuente
Lambda no es un objeto sino una interfaz funcional. Se pueden definir tantas interfaces funcionales como puedan utilizando @FuntionalInterface como anotación.
La salida será la siguiente
El concepto básico de una expresión Lambda es definir su propia lógica pero argumentos ya definidos. Entonces, en el código anterior, puede cambiar la definición de la función do de la adición a cualquier otra definición, pero sus argumentos están limitados a 2.
fuente
Básicamente, para pasar una expresión lamda como parámetro, necesitamos un tipo en el que podamos contenerla. Así como un valor entero que tenemos en primitivo int o clase Integer. Java no tiene un tipo separado para la expresión lamda, sino que usa una interfaz como tipo para contener el argumento. Pero esa interfaz debería ser una interfaz funcional .
fuente
Haz lo siguiente ..
Has declarado
method(lambda l)
Todo lo que quieres hacer es crear una interfaz con el nombrelambda
y declarar un método abstractoEl nombre del método no importa aquí.
Así que cuando u Llamada
MyClass.method( (a,b)->a+b)
Esta aplicación(a,b)->a+b
se inyectará a su método de interfaz complemento .So cada vez que se llama al.add
que va a tomar esta aplicación y realizar la suma dea
eb
yreturn l.add(2,3)
volverá5
. - Básicamente esto es lo que hace lambda ...fuente
A continuación se detalla cómo C # maneja este problema (pero expresado como código Java). Algo como esto podría manejar casi todas sus necesidades:
fuente
Hay flexibilidad en el uso de lambda como parámetro. Permite la programación funcional en java. La sintaxis básica es
Lo siguiente es una forma, puede definir un método que tome la interfaz funcional (se usa lambda) como parámetro. a. si desea definir un método declarado dentro de una interfaz funcional, por ejemplo, la interfaz funcional se proporciona como argumento / parámetro a un método llamado desde
main()
Arriba se explica un uso particular de la expresión lambda, hay más. ref Java 8 lambda dentro de un lambda no puede modificar la variable del lambda externo
fuente