Una interfaz que contiene exactamente un método abstracto se conoce como interfaz funcional. Puede tener cualquier número de métodos estáticos predeterminados, pero solo puede contener un método abstracto. También puede declarar métodos de clase de objeto.
La interfaz funcional también se conoce como interfaces de método abstracto único o interfaces SAM. Es una nueva característica de Java que ayuda a lograr un enfoque de programación funcional.
Ejemplo 1
@FunctionalInterface interface sayable{ void say(String msg); } public class FunctionalInterfaceExample implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample fie = new FunctionalInterfaceExample(); fie.say('Hello there'); } }Pruébalo ahora
Producción:
Hello there
Una interfaz funcional puede tener métodos de clase de objeto. Véase en el siguiente ejemplo.
Ejemplo 2
@FunctionalInterface interface sayable{ void say(String msg); // abstract method // It can contain any number of Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } public class FunctionalInterfaceExample2 implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample2 fie = new FunctionalInterfaceExample2(); fie.say('Hello there'); } }Pruébalo ahora
Producción:
Hello there
Interfaz funcional no válida
Una interfaz funcional puede extender otra interfaz sólo cuando no tiene ningún método abstracto.
interface sayable{ void say(String msg); // abstract method } @FunctionalInterface interface Doable extends sayable{ // Invalid '@FunctionalInterface' annotation; Doable is not a functional interface void doIt(); }
Producción:
compile-time error
Ejemplo 3
En el siguiente ejemplo, una interfaz funcional se extiende a una interfaz no funcional.
interface Doable{ default void doIt(){ System.out.println('Do it now'); } } @FunctionalInterface interface Sayable extends Doable{ void say(String msg); // abstract method } public class FunctionalInterfaceExample3 implements Sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample3 fie = new FunctionalInterfaceExample3(); fie.say('Hello there'); fie.doIt(); } }Pruébalo ahora
Producción:
Hello there Do it now
Interfaces funcionales predefinidas de Java
Java proporciona interfaces funcionales predefinidas para manejar la programación funcional mediante el uso de referencias de métodos y lambda.
También puede definir su propia interfaz funcional personalizada. A continuación se muestra la lista de interfaces funcionales que se encuentran en el paquete java.util.function.
Interfaz | Descripción |
---|---|
BiConsumidor | Representa una operación que acepta dos argumentos de entrada y no devuelve ningún resultado. |
Consumidor | Representa una operación que acepta un único argumento y no devuelve ningún resultado. |
Función | Representa una función que acepta un argumento y devuelve un resultado. |
Predicado | Representa un predicado (función con valor booleano) de un argumento. |
Bifunción | Representa una función que acepta dos argumentos y devuelve un resultado. |
Operador binario | Representa una operación sobre dos operandos del mismo tipo de datos. Devuelve un resultado del mismo tipo que los operandos. |
bipredicado | Representa un predicado (función con valor booleano) de dos argumentos. |
Proveedor booleano | Representa un proveedor de resultados con valores booleanos. |
OperadorBinarioDoble | Representa una operación sobre dos operandos de tipo doble y devuelve un valor de tipo doble. |
Doble Consumidor | Representa una operación que acepta un único argumento de tipo doble y no devuelve ningún resultado. |
Doble Función | Representa una función que acepta un argumento de tipo doble y produce un resultado. |
Predicado doble | Representa un predicado (función con valor booleano) de un argumento de tipo doble. |
DobleProveedor | Representa un proveedor de resultados de doble tipo. |
Función DoubleToInt | Representa una función que acepta un argumento de tipo doble y produce un resultado de tipo int. |
Función DoubleToLong | Representa una función que acepta un argumento de tipo doble y produce un resultado de tipo largo. |
OperadorUnarioDoble | Representa una operación en un único operando de tipo doble que produce un resultado de tipo doble. |
OperadorIntBinario | Representa una operación sobre dos operandos de tipo int y devuelve un resultado de tipo int. |
Consumidor internacional | Representa una operación que acepta un único argumento entero y no devuelve ningún resultado. |
Función Int | Representa una función que acepta un argumento entero y devuelve un resultado. |
IntPredicado | Representa un predicado (función con valor booleano) de un argumento entero. |
ProveedorInt | Representa un proveedor de tipo entero. |
Función IntToDouble | Representa una función que acepta un argumento entero y devuelve un doble. |
Función IntToLong | Representa una función que acepta un argumento entero y devuelve un valor largo. |
Operador IntUnario | Representa una operación sobre un único operando entero que produce un resultado entero. |
OperadorBinario Largo | Representa una operación sobre dos operandos de tipo largo y devuelve un resultado de tipo largo. |
Consumidor largo | Representa una operación que acepta un único argumento de tipo largo y no devuelve ningún resultado. |
Función larga | Representa una función que acepta un argumento de tipo largo y devuelve un resultado. |
Predicado largo | Representa un predicado (función con valor booleano) de un argumento de tipo largo. |
Proveedor largo | Representa un proveedor de resultados de tipo largo. |
Función larga a doble | Representa una función que acepta un argumento de tipo largo y devuelve un resultado de tipo doble. |
Función LongToInt | Representa una función que acepta un argumento de tipo largo y devuelve un resultado entero. |
OperadorUnario Largo | Representa una operación en un único operando de tipo largo que devuelve un resultado de tipo largo. |
ObjDoubleConsumer | Representa una operación que acepta un objeto y un argumento doble y no devuelve ningún resultado. |
ObjIntConsumidor | Representa una operación que acepta un objeto y un argumento entero. No devuelve resultado. |
ObjLongConsumidor | Representa una operación que acepta un objeto y un argumento largo, no devuelve ningún resultado. |
Proveedor | Representa un proveedor de resultados. |
Función ToDoubleBi | Representa una función que acepta dos argumentos y produce un resultado de tipo doble. |
Para doble función | Representa una función que devuelve un resultado de tipo doble. |
Función ToIntBi | Representa una función que acepta dos argumentos y devuelve un número entero. |
Función ToInt | Representa una función que devuelve un número entero. |
Función ToLongBi | Representa una función que acepta dos argumentos y devuelve un resultado de tipo largo. |
Función ToLong | Representa una función que devuelve un resultado de tipo largo. |
Operador unario | Representa una operación sobre un único operando que devuelve un resultado del mismo tipo que su operando. |