Una interfície que conté exactament un mètode abstracte es coneix com a interfície funcional. Pot tenir qualsevol nombre de mètodes estàtics per defecte, però només pot contenir un mètode abstracte. També pot declarar mètodes de classe d'objectes.
La interfície funcional també es coneix com a interfícies de mètode abstracte únic o interfícies SAM. És una característica nova de Java, que ajuda a aconseguir un enfocament de programació funcional.
Exemple 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'); } }Prova-ho ara
Sortida:
Hello there
Una interfície funcional pot tenir mètodes de classe d'objecte. Vegeu a l'exemple següent.
Exemple 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'); } }Prova-ho ara
Sortida:
Hello there
Interfície funcional no vàlida
Una interfície funcional només pot ampliar una altra interfície quan no té cap mètode abstracte.
interface sayable{ void say(String msg); // abstract method } @FunctionalInterface interface Doable extends sayable{ // Invalid '@FunctionalInterface' annotation; Doable is not a functional interface void doIt(); }
Sortida:
compile-time error
Exemple 3
En l'exemple següent, una interfície funcional s'estén a una interfície 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(); } }Prova-ho ara
Sortida:
Hello there Do it now
Interfícies funcionals predefinides de Java
Java proporciona interfícies funcionals predefinides per fer front a la programació funcional mitjançant referències lambda i mètodes.
També podeu definir la vostra pròpia interfície funcional personalitzada. A continuació es mostra la llista d'interfícies funcionals que es col·loquen al paquet java.util.function.
Interfície | Descripció |
---|---|
Biconsumidor | Representa una operació que accepta dos arguments d'entrada i no retorna cap resultat. |
Consumidor | Representa una operació que accepta un sol argument i no retorna cap resultat. |
Funció | Representa una funció que accepta un argument i retorna un resultat. |
Predicat | Representa un predicat (funció amb valors booleans) d'un argument. |
Bifunció | Representa una funció que accepta dos arguments i retorna un resultat. |
Operador binari | Representa una operació sobre dos operands del mateix tipus de dades. Retorna un resultat del mateix tipus que els operands. |
BiPredicat | Representa un predicat (funció amb valors booleans) de dos arguments. |
BooleanSupplier | Representa un proveïdor de resultats amb valors booleans. |
DoubleBinaryOperator | Representa una operació sobre dos operands de tipus doble i retorna un valor de tipus doble. |
DoubleConsumer | Representa una operació que accepta un únic argument de tipus doble i no retorna cap resultat. |
DoubleFunction | Representa una funció que accepta un argument de tipus doble i produeix un resultat. |
Doble predicat | Representa un predicat (funció amb valors booleans) d'un argument de tipus doble. |
DobleProveïdor | Representa un proveïdor de resultats de tipus doble. |
DoubleToIntFunction | Representa una funció que accepta un argument de tipus doble i produeix un resultat de tipus int. |
DoubleToLongFunction | Representa una funció que accepta un argument de tipus doble i produeix un resultat de tipus llarg. |
DoubleUnaryOperator | Representa una operació sobre un únic operand de tipus doble que produeix un resultat de tipus doble. |
IntBinaryOperator | Representa una operació sobre dos operands de tipus int i retorna un resultat de tipus int. |
IntConsumer | Representa una operació que accepta un sol argument enter i no retorna cap resultat. |
IntFunction | Representa una funció que accepta un argument enter i retorna un resultat. |
IntPredicate | Representa un predicat (funció amb valors booleans) d'un argument enter. |
IntProveïdor | Representa un proveïdor de tipus enter. |
IntToDoubleFunction | Representa una funció que accepta un argument enter i retorna un doble. |
IntToLongFunction | Representa una funció que accepta un argument enter i retorna un llarg. |
IntUnaryOperator | Representa una operació sobre un únic operand enter que produeix un resultat enter. |
LongBinaryOperator | Representa una operació sobre dos operands de tipus llarg i retorna un resultat de tipus llarg. |
LongConsumer | Representa una operació que accepta un sol argument de tipus llarg i no retorna cap resultat. |
Funció llarga | Representa una funció que accepta un argument de tipus llarg i retorna un resultat. |
Predicat llarg | Representa un predicat (funció amb valors booleans) d'un argument de tipus llarg. |
Proveïdor llarg | Representa un proveïdor de resultats de tipus llarg. |
LongToDoubleFunction | Representa una funció que accepta un argument de tipus llarg i retorna un resultat de tipus doble. |
LongToIntFunction | Representa una funció que accepta un argument de tipus llarg i retorna un resultat sencer. |
LongUnaryOperator | Representa una operació sobre un únic operand de tipus llarg que retorna un resultat de tipus llarg. |
ObjDoubleConsumer | Representa una operació que accepta un objecte i un argument doble i no retorna cap resultat. |
ObjIntConsumer | Representa una operació que accepta un objecte i un argument enter. No retorna resultat. |
ObjLongConsumer | Representa una operació que accepta un objecte i un argument llarg, no retorna cap resultat. |
Proveïdor | Representa un proveïdor de resultats. |
ToDoubleBiFunction | Representa una funció que accepta dos arguments i produeix un resultat de tipus doble. |
ToDoubleFunction | Representa una funció que retorna un resultat de tipus doble. |
ToIntBiFunction | Representa una funció que accepta dos arguments i retorna un nombre enter. |
ToIntFunction | Representa una funció que retorna un nombre enter. |
ToLongBiFunction | Representa una funció que accepta dos arguments i retorna un resultat de tipus llarg. |
ToLongFunction | Representa una funció que retorna un resultat de tipus llarg. |
Operador unari | Representa una operació sobre un únic operand que retorna un resultat del mateix tipus que el seu operand. |