Una interfície funcional a Java és una interfície que només conté un mètode abstracte. Les interfícies funcionals poden tenir diversos mètodes predeterminats o estàtics, però només un mètode abstracte.
A partir de Java 8, es poden utilitzar expressions lambda i referències de mètodes per representar la instància d'una interfície funcional.
Exemple: Ús d'una interfície funcional amb expressió Lambda
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Sortida
New thread created
Explicació:
- El programa anterior demostra l'ús de l'expressió lambda amb la interfície funcional Runnable.
- Runnable té un mètode abstracte run() per la qual cosa es qualifica com una interfície funcional.
- Lambda ()-> System.out.println('Nou fil creat') defineix el mètode run().
- new Thread().start() inicia un nou fil que executa el cos lambda
Nota:
A f la interfície funcional també pot ampliar una altra interfície funcional.
@Interfície Funcional Anotació
L'anotació @FunctionalInterface s'utilitza per garantir que la interfície funcional no pot tenir més d'un mètode abstracte. En cas que hi hagi més d'un mètode abstracte, el compilador marca un missatge "Anotació @FunctionalInterface inesperada". Tanmateix, no és obligatori utilitzar aquesta anotació.
Nota:
L'anotació @FunctionalInterface és opcional, però és una bona pràctica. Ajuda a detectar l'error en una fase inicial assegurant-se que la interfície només té un mètode abstracte.
sense senyal d'entrada
Exemple: definició d'una interfície funcional amb l'anotació @FunctionalInterface
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
Sortida
25
Explicació :
- Square és una interfície funcional amb un únic mètode de càlcul (int x).
- S'utilitza una expressió lambda (int x) -> x * x per implementar el mètode de càlcul.
- Lambda pren x com a entrada i retorna x * x.
Interfícies funcionals de Java abans de Java 8
Abans de Java 8 havíem de crear objectes anònims de classe interna o implementar aquestes interfícies. A continuació es mostra un exemple de com es va implementar la interfície Runnable abans de la introducció de les expressions lambda.
Exemple: Programa Java per demostrar la interfície funcional
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
Sortida
New thread created
Interfícies funcionals de Java integrades
Des de Java SE 1.8 en endavant hi ha moltes interfícies que es converteixen en interfícies funcionals. Totes aquestes interfícies estan anotades amb @FunctionalInterface. Aquestes interfícies són les següents:
- Es pot executar: Aquesta interfície només conté córrer () mètode.
- Comparable: Aquesta interfície només conté el mètode compareTo().
- ActionListener: Aquesta interfície només conté el mètode actionPerformed().
- Invocable: Aquesta interfície només conté el mètode call().
Tipus d'interfícies funcionals en Java
Java SE 8 incloïa quatre tipus principals d'interfícies funcionals que es poden aplicar en diverses situacions, com s'esmenta a continuació:
- Consumidor
- Predicat
- Funció
- Proveïdor
1. Consumidor
El interfície de consum de la interfície funcional és la que només accepta un argument o un argument gentrificat. La interfície de consumidor no té valor de retorn. No retorna res. També hi ha variants funcionals del Consumidor DoubleConsumer IntConsumer i LongConsumer . Aquestes variants accepten valors primitius com a arguments.
A part d'aquestes variants, també hi ha una variant més de la interfície de consum coneguda com Biconsumidor .
Sintaxi:
Consumidor
consumidor = (valor) -> System.out.println (valor);
Aquesta implementació de la interfície funcional Java Consumer imprimeix el valor passat com a paràmetre a la instrucció d'impressió. Aquesta implementació utilitza la funció Lambda de Java.
2. Predicat
El Interfície de predicats representa una funció de valor booleà d'un argument. S'utilitza habitualment per a operacions de filtratge en fluxos. Igual que la interfície funcional del consumidor, la interfície funcional del predicat també té algunes extensions. Aquests són IntPredicate Doble predicat i Predicat llarg . Aquests tipus d'interfícies funcionals de predicats només accepten tipus de dades o valors primitius com a arguments.
Sintaxi:
Interfície pública Predicat
{
prova booleana (T t);
}
La interfície funcional del predicat Java també es pot implementar mitjançant expressions Lambda.
Predicat
predicat = (valor) -> valor != nul; conceptes bàsics de seleni
3. Funció
A funció és un tipus d'interfície funcional a Java que només rep un sol argument i retorna un valor després del processament requerit. Moltes versions diferents de les interfícies de funcions són instrumentals i s'utilitzen habitualment en tipus primitius com double int long.
Sintaxi:
Funció
funció = (valor) -> valor * valor;
- Bifunció: El Bifunció està relacionat substancialment amb una funció. A més, pren dos arguments, mentre que Function accepta un argument.
- Operador unari i operador binari: També hi ha altres dues interfícies funcionals que s'anomenen com Operador unari i Operador binari. Tots dos amplien la funció i la bifunció, respectivament, on tant el tipus d'entrada com el tipus de sortida són iguals.
4. Proveïdor
El Proveïdor La interfície funcional també és un tipus d'interfície funcional que no pren cap entrada ni argument i, tanmateix, retorna una única sortida. Les diferents extensions de la interfície funcional de proveïdors tenen moltes altres funcions de proveïdors, com ara BooleanSupplier DobleProveïdor Proveïdor llarg i IntProveïdor . El tipus de retorn de totes aquestes especialitzacions addicionals només són les seves primitives corresponents.
Sintaxi:
Proveïdor
proveïdor = () -> 'Hola món!';
Exemple: Ús de la interfície de predicats per filtrar cadenes
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
Sortida
Geek GeeksQuiz Geek2
Taula d'interfícies funcionals
Interfícies funcionals | Descripció | Mètode |
|---|---|---|
Es pot executar | Representa una tasca que es pot executar mitjançant un fil. | void run() |
Comparable | Compara dos objectes per ordenar. | int comparaTo(T o) llegir des del fitxer csv en java |
ActionListener | Gestiona un esdeveniment d'acció en la programació basada en esdeveniments. | void actionPerformed(ActionEvent e) |
Cridable | Representa una tasca que pot retornar un resultat o llançar una excepció. | V call() llança una excepció |
Consumidor | Accepta un sol argument d'entrada i no retorna cap resultat. | acceptació nul (T t) |
Predicat | Accepta un sol argument i retorna un resultat booleà. | prova booleana (T t) |
Funció | Accepta un sol argument i retorna un resultat. | R aplica (T t) |
Proveïdor llenguatge java bàsic | No pren cap argument sinó que proporciona un resultat. | T aconsegueix() |
Biconsumidor | Accepta dos arguments i no retorna cap resultat. | acceptar nul (T t U u) |
BiPredicat | Accepta dos arguments i retorna un resultat booleà. | prova booleana (T t U u) |
Bifunció | Accepta dos arguments i retorna un resultat. | R aplica (T t U u) |
Operador unari css per negreta | Aquest és un cas especial de la funció on els tipus d'entrada i de sortida són els mateixos. | T aplica (T t) |
Operador binari | Aquest és un cas especial de BiFunction on els tipus d'entrada i de sortida són els mateixos. | T aplica (T t1 T t2) |
Articles relacionats
- Java 8
- Expressions Lambda de Java