Pular para o conteúdo principal
Módulo 7 · Lição 1 de 213/14 no curso~12 min
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:

Java
@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:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Estrutura das Expressões Lambda

A sintaxe básica de um lambda é:

Code
(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ção return explícita.
Java
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 tipo T e retorna um booleano (método test(T t)).
  • Consumer<T>: aceita um argumento do tipo T e realiza uma operação sem retornar resultado (método accept(T t)).
  • Function<T, R>: aceita um argumento T e retorna um resultado R (método apply(T t)).
  • Supplier<T>: não aceita argumentos e retorna um valor do tipo T (método get()).

Experimente você mesmo

Exercício#java.m7.l1.e1
Tentativas: 0Carregando…

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.

Carregando editor…
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

Exercício#java.m7.l1.e2
Tentativas: 0Carregando…

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'.

Carregando editor…
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

Exercício#java.m7.l1.e3
Tentativas: 0Carregando…

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).

Carregando editor…
Mostrar dica

Use `names.sort((s1, s2) -> s1.compareTo(s2));` para classificar a lista no lugar.

Solução disponível após 3 tentativas