DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 44: Prefira o uso das interfaces funcionais padrão

Evolução das APIs com Lambdas: Com a introdução de lambdas no Java, práticas para escrever APIs mudaram, como evitar o padrão Template Method em favor de fábricas estáticas ou construtores que aceitam objetos de função.

Exemplo do LinkedHashMap: Em vez de sobrescrever o método removeEldestEntry para controle de cache, seria mais moderno usar uma fábrica estática ou construtor com um objeto de função, utilizando a interface funcional BiPredicate.

Uso de Interfaces Funcionais Padrão: O pacote java.util.function oferece uma ampla coleção de interfaces funcionais padrão, que devem ser preferidas a interfaces customizadas para facilitar a compreensão da API e melhorar a interoperabilidade.

Principais Interfaces Funcionais:

  • UnaryOperator: Aplica uma função de tipo T para T.
  • BinaryOperator: Aplica uma função de dois argumentos de tipo T para T.
  • Predicate: Testa um argumento e retorna um booleano.
  • Function: Aplica uma função de tipo T para R.
  • Supplier: Fornece um valor de tipo T sem argumentos.
  • Consumer: Consome um argumento de tipo T sem retorno.

Interfaces Funcionais para Tipos Primitivos: Existem variantes das seis interfaces básicas para tipos primitivos (int, long, double), como IntPredicate e LongBinaryOperator.

Quando Criar Interfaces Funcionais Customizadas:
Quando nenhuma interface padrão atende às necessidades.
Quando é necessário um nome descritivo ou um contrato forte.
Quando a interface pode se beneficiar de métodos padrões customizados.
Uso da Anotação @FunctionalInterface: Indica que a interface foi projetada para suportar lambdas, garantindo que ela tenha apenas um método abstrato.

Evitar Sobrecargas Ambíguas: Não criar métodos com muitas sobrecargas que aceitam interfaces funcionais diferentes na mesma posição de argumento para evitar ambiguidades.

Conclusão: Lambdas e interfaces funcionais devem ser considerados no design de APIs modernas. Geralmente, é preferível usar as interfaces padrão de java.util.function, exceto em casos específicos que justificam interfaces personalizadas.

Top comments (0)