Una interfaz funcional o functional interface es una interfaz que contiene solo un método abstracto. Solo pueden tener una funcionalidad para exhibir. Desde Java 8 en adelante, las expresiones lambda se pueden usar para representar la instancia de una interfaz funcional. Una interfaz funcional puede tener cualquier número de métodos predeterminados.
Anotación @FunctionalInterface
Se recomienda que todas las interfaces funcionales tengan una anotación informativa @FunctionalInterface. Esto comunica claramente el propósito de la interfaz y también permite que un compilador genere un error si la interfaz anotada no cumple las condiciones.
Cualquier interfaz con un SAM (Single Abstract Method) es una interfaz funcional y su implementación puede tratarse como expresiones lambda.
@FunctionalInterface
interface Ejecutor {
void ejecutar();
}
Static y Default
Cómo ya hemos descrito anteriormente, las interfaces funcionales solo pueden tener un método abstractor, sin embargo, pueden incluir métodos estáticos (static) o por defecto (default).
Static
Los métodos estáticos (static) son métodos que contienen implementación pero que dependen de la interfaz y no del objeto creado, por ello es aceptado en las interfaces funcionales (functional interfaces)
@FunctionalInterface
interface Ejecutor {
void ejecutar();
static void metodoEstatico(){}
}
Default
Los métodos por defecto (default) son métodos que contienen implementación pero que puede ser sobreescritos, por ello es aceptado en las interfaces funcionales (functional interfaces).
@FunctionalInterface
interface Ejecutor {
void ejecutar();
default void metodoPorDefecto(){}
}