Java 8 - Expresiones Lambda

Las expresiones Lambda se introducen en Java 8 y se promociona como la característica más importante de Java 8. La expresión Lambda facilita la programación funcional y simplifica mucho el desarrollo.

Sintaxis

Una expresión lambda se caracteriza por la siguiente sintaxis.

parameter -> expression body

A continuación se muestran las características importantes de una expresión lambda.

  • Optional type declaration- No es necesario declarar el tipo de parámetro. El compilador puede inferir lo mismo a partir del valor del parámetro.

  • Optional parenthesis around parameter- No es necesario declarar un solo parámetro entre paréntesis. Para varios parámetros, se requieren paréntesis.

  • Optional curly braces - No es necesario utilizar llaves en el cuerpo de la expresión si el cuerpo contiene una sola declaración.

  • Optional return keyword- El compilador devuelve automáticamente el valor si el cuerpo tiene una sola expresión para devolver el valor. Se requieren llaves para indicar que la expresión devuelve un valor.

Ejemplo de expresiones lambda

Cree el siguiente programa Java utilizando cualquier editor de su elección en, digamos, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester tester = new Java8Tester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

Verificar el resultado

Compila la clase usando javac compilador de la siguiente manera:

C:\JAVA>javac Java8Tester.java

Ahora ejecute Java8Tester de la siguiente manera:

C:\JAVA>java Java8Tester

Debería producir el siguiente resultado:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

A continuación se presentan los puntos importantes que deben considerarse en el ejemplo anterior.

  • Las expresiones Lambda se utilizan principalmente para definir la implementación en línea de una interfaz funcional, es decir, una interfaz con un único método. En el ejemplo anterior, hemos utilizado varios tipos de expresiones lambda para definir el método de operación de la interfaz MathOperation. Entonces hemos definido la implementación de sayMessage de GreetingService.

  • La expresión Lambda elimina la necesidad de clases anónimas y proporciona una capacidad de programación funcional muy simple pero poderosa para Java.

Alcance

Con la expresión lambda, puede hacer referencia a cualquier variable final o variable final efectiva (que se asigna solo una vez). La expresión Lambda arroja un error de compilación si a una variable se le asigna un valor por segunda vez.

Ejemplo de alcance

Cree el siguiente programa Java utilizando cualquier editor de su elección en, digamos, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> 
      System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

Verificar el resultado

Compila la clase usando javac compilador de la siguiente manera:

C:\JAVA>javac Java8Tester.java

Ahora ejecute Java8Tester de la siguiente manera:

C:\JAVA>java Java8Tester

Debería producir el siguiente resultado:

Hello! Mahesh