DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 42: Prefira os lambdas às classes anônimas

Uso de Lambdas e Interfaces Funcionais no Java 8

Introdução

  • Java 8 introduziu interfaces funcionais, lambdas e referências de métodos para facilitar a criação de objetos de função.
  • A API de streams foi adicionada para auxiliar no processamento de sequências de elementos de dados.

Item 42: Prefira os lambdas às classes anônimas
Histórico: Antes do Java 8, interfaces com um único método abstrato eram usadas como tipos de função, implementadas frequentemente com classes anônimas.

  • Exemplo: Classificar uma lista de strings por comprimento usando uma classe anônima.

Problema com Classes Anônimas: Verbosidade excessiva dificultava a programação funcional.

Lambdas no Java 8:

Mais concisos que classes anônimas.

Exemplos:
Usar lambda para comparação de strings:

List<String> words = Arrays.asList("apple", "banana", "cherry");
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));

Enter fullscreen mode Exit fullscreen mode

Inferência de Tipo:

O compilador deduz tipos pelo contexto.
Pode ser necessário especificar tipos manualmente se a inferência falhar.
Exemplo: List em vez de List.

Uso de Métodos de Construção de Comparadores:

Exemplo: Usar Comparator.comparingInt:

Collections.sort(words, Comparator.comparingInt(String::length));

Enter fullscreen mode Exit fullscreen mode

Lambdas em Enums:

Facilitam a implementação de comportamentos específicos para constantes de enum.

Operation sem lambda:

Image description

Exemplo: Enum Operation com lambdas:

public enum Operation {
    PLUS((x, y) -> x + y),
    MINUS((x, y) -> x - y);

    private final DoubleBinaryOperator operation;

    Operation(DoubleBinaryOperator operation) {
        this.operation = operation;
    }

    public double apply(double x, double y) {
        return operation.applyAsDouble(x, y);
    }
}

Enter fullscreen mode Exit fullscreen mode

Limitações dos Lambdas:

  • Lambdas não têm nomes nem documentação.
  • Devem ser curtos e claros.
  • Não podem acessar membros de instâncias de enum.
  • Não podem ser usados para criar instâncias de classes abstratas ou interfaces com múltiplos métodos abstratos.
  • Não podem se referenciar diretamente (usar this).

Classes Anônimas Ainda Têm Lugar:

  • Úteis para instâncias de classes abstratas e interfaces com vários métodos.
  • Referenciamento próprio dentro do corpo.
  • Melhor opção para criar instâncias serializáveis de objetos de função.

Considerações de Serialização:

  • Evite serializar lambdas ou instâncias de classes anônimas.
  • Use classes aninhadas estáticas privadas para objetos de função serializáveis.

Conclusão
Lambdas são preferíveis para objetos de função pequenos e facilitam a programação funcional no Java.
Use classes anônimas apenas quando necessário, como para tipos que não são interfaces funcionais.
Lambdas abrem portas para técnicas de programação funcional que eram impraticáveis antes no Java.

Top comments (0)