Lições do módulo (1/2)
Expressões Lambda
A partir do Java 8, a programação funcional é suportada por meio de Expressões Lambda. Uma expressão lambda é essencialmente um método anônimo (uma função sem nome) que pode ser passado como argumento para métodos ou armazenado em variáveis.
Interfaces Funcionais
Uma expressão lambda só pode ser usada quando uma Interface Funcional for necessária. Uma interface funcional é uma interface que declara exatamente um método abstrato. Java marca essas interfaces com a anotação opcional @FunctionalInterface.
Exemplo de interface funcional definida pelo usuário:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}Antes do Java 8, você teria que definir uma classe interna anônima. Com lambdas, a sintaxe é simplificada para:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Estrutura das Expressões Lambda
A sintaxe básica de um lambda é:
(parameters) -> { body }
- Sem parâmetros:
() -> System.out.println("Hello") - Parâmetro único:
x -> x * 2(parênteses podem ser omitidos) - Vários parâmetros:
(x, y) -> x + y - Corpo multilinhas: se o corpo contiver diversas instruções, serão necessários colchetes
{}e uma instruçãoreturnexplícita.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};Interfaces Funcionais Padrão em Java
O pacote java.util.function fornece várias interfaces funcionais integradas:
Predicate<T>: aceita um argumento do tipoTe retorna um booleano (métodotest(T t)).Consumer<T>: aceita um argumento do tipoTe realiza uma operação sem retornar resultado (métodoaccept(T t)).Function<T, R>: aceita um argumentoTe retorna um resultadoR(métodoapply(T t)).Supplier<T>: não aceita argumentos e retorna um valor do tipoT(métodoget()).
Experimente você mesmo
Complete o código instanciando a interface da Calculadora usando uma expressão lambda que adiciona dois números inteiros. Em seguida, invoque o método calcular passando 5 e 3 e imprima o resultado.
Mostrar dica
Declare `Calculator adder = (a, b) -> a + b;` e então invoque `adder.calculate(5, 3)` dentro da chamada de impressão.
Solução disponível após 3 tentativas
Crie uma instância da interface funcional padrão Predicate<String> chamada isLong usando uma expressão lambda que verifica se o comprimento da string é maior que 5 caracteres. Em seguida, imprima o resultado do teste para 'olá mundo'.
Mostrar dica
O lambda para um `Predicate<String>` recebe um parâmetro `s` e retorna `s.length() > 5` como uma condição booleana.
Solução disponível após 3 tentativas
Classifique a lista de nomes de strings em ordem alfabética invocando o método sort() nela e passando uma expressão lambda que implementa o Comparator (pegando duas strings s1, s2 e comparando-as usando compareTo).
Mostrar dica
Use `names.sort((s1, s2) -> s1.compareTo(s2));` para classificar a lista no lugar.
Solução disponível após 3 tentativas