Expresión Lambda en Java
En Java, las expresiones Lambda básicamente expresan instancias de interfaces funcionales (una interfaz con un único método abstracto se denomina interfaz funcional). Las expresiones Lambda en Java son lo mismo que las funciones lambda, que son un bloque corto de código que acepta entradas como parámetros y devuelve un valor resultante. Las expresiones Lambda se incluyeron recientemente en Java SE 8.
Funcionalidades de la expresión Lambda en Java
Las expresiones Lambda implementan la única función abstracta y, por lo tanto, implementan interfaces funcionales. Las expresiones lambda se agregan en Java 8 y proporcionan las siguientes funcionalidades.
- Habilite esta opción para tratar la funcionalidad como un argumento de método o el código como datos.
- Una función que se puede crear sin pertenecer a ninguna clase.
- Una expresión lambda se puede transmitir como si fuera un objeto y ejecutarse según demanda.
Ejemplo de expresión Java Lambda
Java // Java program to demonstrate lambda expressions // to implement a user defined functional interface. // A sample functional interface (An interface with // single abstract method interface FuncInterface { // An abstract function void abstractFun(int x); // A non-abstract (or default) function default void normalFun() { System.out.println('Hello'); } } class Test { public static void main(String args[]) { // lambda expression to implement above // functional interface. This interface // by default implements abstractFun() FuncInterface fobj = (int x)->System.out.println(2*x); // Esto llama a la expresión lambda anterior e imprime 10. fobj.abstractFun(5); } } Producción
10
Sintaxis de expresión lambda
lambda operator ->cuerpo
Parámetros de expresión lambda
Hay tres parámetros de expresión Lambda que se mencionan a continuación:
- Parámetro cero
- Parámetro único
- Múltiples parámetros
1. Expresión Lambda con parámetro cero
() ->System.out.println('Parámetro cero lambda'); 2. Expresión Lambda con parámetro único
(p) ->System.out.println('Un parámetro: ' + p); No es obligatorio utilizar paréntesis si el tipo de esa variable se puede inferir del contexto.
Java // A Java program to demonstrate simple lambda expressions import java.util.ArrayList; class Test { public static void main(String args[]) { // Creating an ArrayList with elements // {1, 2, 3, 4} ArrayList arrL = nueva lista de matrices (); arrL.add(1); arrL.add(2); arrL.add(3); arrL.add(4); // Usando la expresión lambda para imprimir todos los elementos // de arrL arrL.forEach(n -> System.out.println(n)); // Usando la expresión lambda para imprimir elementos pares // de arrL arrL.forEach(n -> { if (n % 2 == 0) System.out.println(n); }); } } Producción
1 2 3 4 2 4
Nota: que las expresiones lambda solo se pueden usar para implementar interfaces funcionales. También en el ejemplo anterior, la expresión lambda implementa Consumidor Interfaz funcional.
3. Expresión Lambda con múltiples parámetros
(p1, p2) ->System.out.println('Múltiples parámetros: ' + p1 + ', ' + p2); Un programa Java para demostrar el funcionamiento de una expresión lambda con dos argumentos.
Java // Java program to demonstrate working of lambda expressions public class Test { // operation is implemented using lambda expressions interface FuncInter1 { int operation(int a, int b); } // sayMessage() is implemented using lambda expressions // above interface FuncInter2 { void sayMessage(String message); } // Performs FuncInter1's operation on 'a' and 'b' private int operate(int a, int b, FuncInter1 fobj) { return fobj.operation(a, b); } public static void main(String args[]) { // lambda expression for addition for two parameters // data type for x and y is optional. // This expression implements 'FuncInter1' interface FuncInter1 add = (int x, int y) ->x + y; // multiplicación de expresión lambda para dos // parámetros Esta expresión también implementa // interfaz 'FuncInter1' FuncInter1 multiplicar = (int x, int y) -> x * y; // Creando un objeto de Prueba para llamar a operar usando // diferentes implementaciones usando lambda // Expresiones Test tobj = new Test(); // Suma dos números usando la expresión lambda System.out.println('La suma es ' + tobj.operate(6, 3, add)); // Multiplica dos números usando la expresión lambda System.out.println('La multiplicación es ' + tobj.operate(6, 3, multiplicar)); // expresión lambda para un solo parámetro // Esta expresión implementa la interfaz 'FuncInter2' FuncInter2 fobj = mensaje -> System.out.println('Hello ' + mensaje); fobj.sayMessage('Geek'); } } Producción
Addition is 9 Multiplication is 18 Hello Geek
Nota: Las expresiones lambda son como funciones y aceptan parámetros como funciones.
Conclusión
A continuación se mencionan algunos puntos importantes de este artículo:
- El cuerpo de una expresión lambda puede contener cero, una o más declaraciones.
- Cuando hay una sola declaración, las llaves no son obligatorias y el tipo de retorno de la función anónima es el mismo que el de la expresión del cuerpo.
- Cuando hay más de una declaración, estas deben estar entre llaves (un bloque de código) y el tipo de retorno de la función anónima es el mismo que el tipo del valor devuelto dentro del bloque de código, o nulo si no se devuelve nada. .
Preguntas frecuentes sobre la expresión Lambda
P1. ¿Qué tipo de expresión lambda Java?
Respuesta:
Las expresiones Java Lambda son el bloque corto de código que acepta entradas como parámetros y devuelve un valor resultante.
P2. ¿Es bueno utilizar expresiones lambda en Java?
Respuesta:
Sí, el uso de expresiones lambda facilita el uso y la compatibilidad con otras API.
P3. ¿Cuáles son las desventajas de Java lambda?
Respuesta:
Las funciones lambda de Java solo se pueden utilizar con interfaces funcionales.
P4. Según las reglas de sintaxis que se acaban de mostrar, ¿cuál de las siguientes NO son expresiones lambda válidas?
- () -> {}
- () -> geeksforgeeks
- () -> {regresar geeksforgeeks;}
- (Entero i) -> devolver geeksforgeeks + i;
- (Cadena s) -> {geeksforgeeks;}
Respuesta:
4 y 5 son lambdas no válidas, el resto son válidas. Detalles:
- Esta lambda no tiene parámetros y devuelve void. Es similar a un método con un cuerpo vacío: public void run() { }.
- Esta lambda no tiene parámetros y devuelve una cadena como expresión.
- Esta lambda no tiene parámetros y devuelve una cadena (usando una declaración de retorno explícita, dentro de un bloque).
- return es una declaración de flujo de control. Para que esta lambda sea válida, se requieren llaves de la siguiente manera: (Entero i) -> { return geeksforgeeks + i; }.
- geeks para geeks es una expresión, no una declaración. Para que esta lambda sea válida, puede eliminar las llaves y el punto y coma de la siguiente manera: (String s) -> geeks for geeks. O si lo prefiere, puede utilizar una declaración de retorno explícita de la siguiente manera: (String s) -> { return geeks for geeks; }.