Dominando Expressões Lambda no Java 8: Guia de Programação Funcional
Expressões lambda foram introduzidas no Java 8 e são consideradas o maior recurso do Java 8. Lambdas facilitam programação funcional e simplificam muito o desenvolvimento.
Sintaxe
Uma expressão lambda é caracterizada pela seguinte sintaxe:
parameter -> expression body
Características Importantes
- Declaração de tipo opcional - Não precisa declarar tipo do parâmetro. O compilador infere do valor.
- Parênteses opcionais ao redor do parâmetro - Não precisa de parênteses para parâmetro único. Para múltiplos, parênteses são obrigatórios.
- Chaves opcionais - Não precisa de chaves no corpo se tiver uma única instrução.
- Palavra-chave return opcional - Compilador retorna automaticamente o valor se o corpo tem única expressão. Chaves necessárias para indicar retorno explícito.
Exemplo de Expressões Lambda
Crie o seguinte programa Java em C:\JAVA.
Java8Tester.java
public class Java8Tester {
public static void main(String args[]) {
Java8Tester tester = new Java8Tester();
// Com declaração de tipo
MathOperation addition = (int a, int b) -> a + b;
// Sem declaração de tipo
MathOperation subtraction = (a, b) -> a - b;
// Com return e chaves
MathOperation multiplication = (int a, int b) -> { return a * b; };
// Sem return e sem chaves
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));
// Sem parênteses
GreetingService greetService1 = message -> System.out.println("Hello " + message);
// Com parênteses
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);
}
}
Verifique o Resultado
Compile com javac:
C:\JAVA> javac Java8Tester.java
Execute:
C:\JAVA> java Java8Tester
Saída Esperada
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh
Pontos Importantes:
- Lambdas definem implementação inline de interface funcional (interface com método único). No exemplo, vários tipos de lambdas definem o método
operationdeMathOperationesayMessagedeGreetingService. - Lambdas eliminam a necessidade de classes anônimas e dão capacidade de programação funcional simples e poderosa ao Java.
Escopo
Usando lambda, você pode referenciar qualquer variável final ou effectively final (atribuída apenas uma vez). Lambda lança erro de compilação se variável for atribuída segunda vez.
Exemplo de Escopo
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); }
}
Saída
Hello! Mahesh
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Entendendo Expressões, Instruções e Blocos em Java
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código