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)