No Java, qualquer interface com um único método abstrato já é considerada uma interface funcional. Isso significa que não é necessário fazer nenhuma alteração para que ela possa ser usada com expressões lambda.
🔹 Criando uma Interface Funcional
Por exemplo, suponha que temos a interface Validador que verifica se um dado é válido:
interface Validador<T> { boolean valida(T t); }
Antes do Java 8, precisaríamos de uma classe anônima para instanciar essa interface:
Validador<String> validadorCEP = new Validador<String>() { public boolean valida(String valor) { return valor.matches("[0-9]{5}-[0-9]{3}"); } };
🔹 Expressões Lambda
A partir do Java 8, podemos substituir a classe anônima por uma expressão lambda, tornando o código mais simples:
Validador<String> validadorCEP = valor -> { return valor.matches("[0-9]{5}-[0-9]{3}"); };
E podemos reduzir ainda mais, removendo o return, as chaves {} e o ponto e vírgula ;:
Validador<String> validadorCEP = valor -> valor.matches("[0-9]{5}-[0-9]{3}");
Agora, a validação do CEP ocupa apenas uma linha! 🚀
🔹 A Anotação @FunctionalInterface
Para evitar que alguém modifique a interface acidentalmente, podemos usar a anotação @FunctionalInterface:
@FunctionalInterface interface Validador<T> { boolean valida(T t); }
Se tentarmos adicionar um segundo método abstrato, o compilador gera um erro:
@FunctionalInterface interface Validador<T> { boolean valida(T t); boolean outroMetodo(T t); // ❌ ERRO! }
Erro gerado:
java: Unexpected @FunctionalInterface annotation Validador is not a functional interface multiple non-overriding abstract methods found in interface
A anotação não é obrigatória, mas garante que a interface continue sendo funcional no futuro.
📌 Conclusão
Interfaces com um único método abstrato são automaticamente funcionais.
Podem ser instanciadas com expressões lambda em vez de classes anônimas.
A anotação @FunctionalInterface protege a interface contra modificações acidentais.
Esse recurso torna o código mais legível, curto e eficiente! 🚀
Top comments (0)