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)