Java ha estat per sempre un llenguatge de programació orientada a objectes. Mitjançant el llenguatge de programació orientat a objectes, podem declarar que tot el que està present en el llenguatge de programació Java gira al llarg dels objectes, excepte alguns dels tipus de dades primitius i mètodes primitius per a la integritat i la simplicitat. No hi ha funcions només presents en un llenguatge de programació anomenat Java. Les funcions del llenguatge de programació Java formen part d'una classe, i si algú les vol utilitzar, ha d'utilitzar la classe o l'objecte de la classe per cridar qualsevol funció.
Interfícies funcionals de Java
A interfície funcional és una interfície que només conté un mètode abstracte. Només poden tenir una funcionalitat per mostrar. A partir de Java 8, expressions lambda es pot utilitzar per representar la instància d'una interfície funcional. Una interfície funcional pot tenir qualsevol nombre de mètodes predeterminats. Es pot executar , ActionListener , i Comparable són alguns dels exemples d'interfícies funcionals.
La interfície funcional també es reconeix com a Interfícies de mètode abstracte únic . En resum, també es coneixen com Interfícies SAM . Les interfícies funcionals en Java són la nova característica que ofereix als usuaris l'enfocament de la programació fonamental.
Les interfícies funcionals s'inclouen a Java SE 8 amb expressions Lambda i referències de mètodes per tal que el codi sigui més llegible, net i senzill. Les interfícies funcionals són interfícies que asseguren que només inclouen un mètode abstracte. Les interfícies funcionals s'utilitzen i s'executen representant la interfície amb un anotació anomenada @Interfície Funcional . Com s'ha descrit anteriorment, les interfícies funcionals només poden contenir un mètode abstracte. Tanmateix, poden incloure qualsevol quantitat de mètodes estàtics i predeterminats.
A les interfícies funcionals, no cal utilitzar la paraula clau abstracta, ja que és opcional utilitzar la paraula clau abstracta perquè, per defecte, el mètode definit dins de la interfície només és abstracte. També podem anomenar expressions Lambda com a instància de la interfície funcional.
prova d'atrapar catch java
Exemple d'interfícies funcionals de Java
Exemple 1:
Abans de Java 8, havíem de crear objectes anònims de classe interna o implementar aquestes interfícies.
Java
// Java program to demonstrate functional interface> class> Test {> >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>
Exemple 2:
Java 8 en endavant, podem assignar expressió lambda al seu objecte d'interfície funcional com aquest:
Java
// Java program to demonstrate Implementation of> // functional interface using lambda expressions> class> Test {> >public> static> void> main(String args[])> >{> >// lambda expression to create the object> >new> Thread(() ->{> >System.out.println(>'New thread created'>);> >}).start();> >}> }> |
>
>Sortida
New thread created>
Anotació @FunctionalInterface
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ó.
A continuació es mostra la implementació del tema anterior:
Java
// Java program to demonstrate lambda expressions to> // implement a user defined functional interface.> @FunctionalInterface> interface> Square {> >int> calculate(>int> x);> }> class> Test {> >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);> >}> }> |
>
8 a 1 multiplexor
>Sortida
25>
Algunes 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:
- Runnable -> Aquesta interfície només conté el mètode run(). Comparable -> Aquesta interfície només conté el mètode compareTo(). ActionListener -> Aquesta interfície només conté el mètode actionPerformed(). Callable -> Aquesta interfície només conté el mètode call().
Java SE 8 incloïa quatre tipus principals d'interfícies funcionals que es pot aplicar en múltiples situacions com s'esmenta a continuació:
- Proveïdor de funcions de predicat del consumidor
Entre les quatre interfícies anteriors, les tres primeres interfícies, és a dir, Consumidor, Predicat i Funció, també tenen addicions que es proporcionen a continuació:
- Consumidor -> Biconsumidor
- Predicat -> Bi-predicat
- Funció -> Bifunció, operador unari, operador binari
1. Consumidor
La interfície de consumidor 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 Consumer: 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 Consumer coneguda com Bi-Consumer.
Biconsumidor - Bi-Consumer és la variant més emocionant de la interfície Consumer. La interfície de consumidor només pren un argument, però a l'altra banda, la interfície Bi-Consumer pren dos arguments. Tant Consumer com Bi-Consumer no tenen valor de retorn. Tampoc retorna res com la interfície del consumidor. S'utilitza per iterar entre les entrades del mapa.
Sintaxi / Prototip de la interfície funcional del consumidor –
Consumer consumer = (value) ->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
En lògica científica, una funció que accepta un argument i, a canvi, genera un valor booleà com a resposta es coneix com a predicat. De la mateixa manera, en el llenguatge de programació Java, una interfície funcional de predicat de Java és un tipus de funció que accepta un sol valor o argument i fa algun tipus de processament sobre ell, i retorna una resposta booleana (vertader/fals). La implementació de la interfície funcional del predicat també encapsula la lògica del filtratge (un procés que s'utilitza per filtrar components de flux a partir d'un predicat proporcionat) a Java.
Igual que la interfície funcional del consumidor, la interfície funcional del predicat també té algunes extensions. Aquests són IntPredicate, DoublePredicate i LongPredicate. Aquests tipus d'interfícies funcionals de predicats només accepten tipus de dades o valors primitius com a arguments.
Bi-predicat - Bi-Predicate també és una extensió de la interfície funcional Predicate, que, en lloc d'un, pren dos arguments, fa algun processament i retorna el valor booleà.
Sintaxi de la interfície funcional de predicats -
public interface Predicate { boolean test(T t); }> La interfície funcional del predicat també es pot implementar mitjançant una classe. La sintaxi per a la implementació de la interfície funcional de predicats mitjançant una classe es dóna a continuació:
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }> La interfície funcional del predicat Java també es pot implementar mitjançant expressions Lambda. A continuació es mostra un exemple de la implementació de la interfície funcional de predicats:
Predicate predicate = (value) ->valor != nul;>
Aquesta implementació d'interfícies funcionals en Java utilitzant expressions Java Lambda és més manejable i eficaç que la implementada mitjançant una classe, ja que ambdues implementacions fan el mateix treball, és a dir, retornen la mateixa sortida.
3. Funció
Una 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. Hi ha moltes versions d'interfícies de funció perquè un tipus primitiu no pot implicar un argument de tipus general, de manera que necessitem aquestes versions d'interfícies de funció. Moltes versions diferents de les interfícies de funcions són instrumentals i s'utilitzen habitualment en tipus primitius com double, int, long. Les diferents seqüències d'aquests tipus primitius també s'utilitzen en l'argument.
Aquestes versions són:
Bifunció
La bifunció està relacionada substancialment amb una funció. A més, pren dos arguments, mentre que Function accepta un argument.
El prototip i la sintaxi de Bi-Function es donen a continuació:
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }> Al codi de la interfície anterior, T i U són les entrades i només hi ha una sortida que és R.
Sridevi
Operador unari i operador binari
També hi ha altres dues interfícies funcionals que s'anomenen Operador Unari i Operador Binari. Tots dos amplien la funció i la bifunció, respectivament. En paraules senzilles, l'operador unari amplia la funció i l'operador binari amplia la funció bi.
El prototip de l'operador unari i l'operador binari s'esmenta a continuació:
i. Operador unari
@FunctionalInterface public interface UnaryOperator extends Function { ……... }> ii . Operador binari
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }> Podem entendre davant l'exemple anterior que l'operador unari només accepta un argument i només retorna un sol argument. Tot i així, a l'operador unari tant els valors d'entrada com de sortida han de ser idèntics i del mateix tipus.
D'altra manera, l'operador binari pren dos valors i retorna un valor comparable a Bi-Function, però similar a un operador unari, els tipus de valors d'entrada i sortida han de ser idèntics i del mateix tipus.
4. Proveïdor
La interfície funcional del proveïdor també és un tipus d'interfície funcional que no pren cap entrada ni argument i, tanmateix, retorna una única sortida. Aquest tipus d'interfície funcional s'utilitza generalment en la generació mandrosa de valors. Les interfícies funcionals del proveïdor també s'utilitzen per definir la lògica per a la generació de qualsevol seqüència. Per exemple: la lògica darrere de la sèrie de Fibonacci es pot generar amb l'ajuda del corrent. mètode genera, que s'implementa per la interfície funcional del proveïdor.
Les diferents extensions de la interfície funcional del proveïdor tenen moltes altres funcions de proveïdors com BooleanSupplier, DoubleSupplier, LongSupplier i IntSupplier. El tipus de retorn de totes aquestes especialitzacions addicionals només són les seves primitives corresponents.
La sintaxi/prototip de la interfície funcional del proveïdor és:
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }> A continuació es mostra la implementació del tema anterior:
Java
// A simple program to demonstrate the use> // of predicate interface> import> java.util.*;> import> java.util.function.Predicate;> class> Test {> >public> static> void> main(String args[])> >{> >// create a list of strings> >List names = Arrays.asList(> >'Geek'>,>'GeeksQuiz'>,>'g1'>,>'QA'>,>'Geek2'>);> >// declare the predicate type as string and use> >// lambda expression to create object> >Predicate p = (s) ->s.startsWith(>'G'>);> >// Iterate through the list> >for> (String st : names) {> >// call the test method> >if> (p.test(st))> >System.out.println(st);> >}> >}> }> |
>
>Sortida
Geek GeeksQuiz Geek2>
Punts/Observació importants ns:
A continuació, es mostren alguns punts significatius sobre les interfícies funcionals a Java:
- A les interfícies funcionals, només s'admet un mètode abstracte. Si l'anotació d'una interfície funcional, és a dir, @FunctionalInterface no s'implementa o s'escriu amb una interfície de funció, es pot declarar més d'un mètode abstracte al seu interior. Tanmateix, en aquesta situació amb més d'una funció, aquesta interfície no s'anomenarà interfície funcional. S'anomena interfície no funcional.
- L'anotació @FunctionalInterface no és necessària, ja que només és voluntària. Això està escrit perquè ajuda a comprovar el nivell del compilador. A més d'això, és opcional.
- Es poden afegir una infinitat de mètodes (ja siguin estàtics o per defecte) a la interfície funcional. En paraules senzilles, no hi ha límit per a una interfície funcional que conté mètodes estàtics i predeterminats.
- Els mètodes de substitució de la classe pare no infringeixen les regles d'una interfície funcional a Java.
- El java.util.function El paquet conté moltes interfícies funcionals integrades a Java 8.