Java je za vedno ostala objektno usmerjen programski jezik. Z objektno usmerjenim programskim jezikom lahko razglasimo, da se vse, kar je prisotno v programskem jeziku Java, vrti po objektih, razen nekaterih primitivnih tipov podatkov in primitivnih metod za celovitost in preprostost. V programskem jeziku, imenovanem Java, ni samo funkcij. Funkcije v programskem jeziku Java so del razreda in če jih nekdo želi uporabljati, mora uporabiti razred ali objekt razreda za klic katere koli funkcije.
Funkcionalni vmesniki Java
A funkcionalni vmesnik je vmesnik, ki vsebuje samo eno abstraktno metodo. Imajo lahko samo eno funkcionalnost za prikaz. Od Jave 8 naprej, lambda izrazi se lahko uporablja za predstavitev primerka funkcionalnega vmesnika. Funkcionalni vmesnik ima lahko poljubno število privzetih metod. Izvedljivo , ActionListener , in Primerljivo je nekaj primerov funkcionalnih vmesnikov.
Funkcionalni vmesnik je dodatno priznan kot Vmesniki posamezne abstraktne metode . Skratka znani so tudi kot SAM vmesniki . Funkcionalni vmesniki v Javi so nova funkcija, ki uporabnikom ponuja pristop temeljnega programiranja.
javascript window.open
Funkcionalni vmesniki so vključeni v Java SE 8 z izrazi Lambda in referencami metod, da bi bila koda bolj berljiva, čista in enostavna. Funkcionalni vmesniki so vmesniki, ki zagotavljajo, da vključujejo točno eno abstraktno metodo. Funkcionalni vmesniki se uporabljajo in izvajajo tako, da vmesnik predstavljajo z imenovana opomba @Funkcijski vmesnik . Kot je opisano prej, lahko funkcionalni vmesniki vsebujejo samo eno abstraktno metodo. Vendar pa lahko vključujejo poljubno količino privzetih in statičnih metod.
V funkcionalnih vmesnikih ni potrebe po uporabi abstraktne ključne besede, saj je uporaba abstraktne ključne besede neobvezna, ker je privzeto metoda, definirana znotraj vmesnika, samo abstraktna. Lambda izraze lahko imenujemo tudi kot primer funkcionalnega vmesnika.
Primer funkcionalnih vmesnikov Java
Primer 1:
Pred Javo 8 smo morali ustvariti anonimne objekte notranjega razreda ali implementirati te vmesnike.
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();> > }> }> |
>
>Izhod
New thread created>
Primer 2:
Java 8 naprej, lahko dodelimo lambda izraz njegovemu objektu funkcionalnega vmesnika takole:
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();> > }> }> |
>
>Izhod
New thread created>
Opomba @FunctionalInterface
Opomba @FunctionalInterface se uporablja za zagotovitev, da funkcijski vmesnik ne more imeti več kot ene abstraktne metode. Če je prisotnih več kot ena abstraktna metoda, prevajalnik označi sporočilo »Nepričakovana opomba @FunctionalInterface«. Vendar uporaba te opombe ni obvezna.
Spodaj je izvedba zgornje teme:
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);> > }> }> |
terminal kali linux
>
>Izhod
25>
Nekateri vgrajeni funkcionalni vmesniki Java
Od Java SE 1.8 naprej obstaja veliko vmesnikov, ki so pretvorjeni v funkcionalne vmesnike. Vsi ti vmesniki so označeni z @FunctionalInterface. Ti vmesniki so naslednji –
- Runnable –> Ta vmesnik vsebuje samo metodo run(). Primerljivo –> Ta vmesnik vsebuje samo metodo compareTo(). ActionListener –> Ta vmesnik vsebuje samo metodo actionPerformed(). Callable –> Ta vmesnik vsebuje samo metodo call().
Java SE 8 je vključevala štiri glavne vrste funkcionalnih vmesnikov ki se lahko uporabi v več situacijah, kot je navedeno spodaj:
- Potrošniška predikatna funkcija Dobavitelj
Med prejšnjimi štirimi vmesniki imajo prvi trije vmesniki, tj. potrošnik, predikat in funkcija, prav tako dodatke, ki so na voljo spodaj –
- Potrošnik -> Bi-potrošnik
- Predikat -> Bi-predikat
- Funkcija -> Bi-funkcija, unarni operator, binarni operator
1. Potrošnik
Uporabniški vmesnik funkcionalnega vmesnika je tisti, ki sprejme samo en argument ali gentrificiran argument. Uporabniški vmesnik nima povratne vrednosti. Nič ne vrne. Obstajajo tudi funkcionalne različice potrošnika — DoubleConsumer, IntConsumer in LongConsumer. Te različice sprejemajo primitivne vrednosti kot argumente.
Poleg teh različic obstaja še ena različica vmesnika Consumer, znana kot Bi-Consumer.
Dvopotrošnik – Bi-Consumer je najbolj vznemirljiva različica vmesnika Consumer. Uporabniški vmesnik sprejme samo en argument, na drugi strani pa vmesnik Bi-Consumer sprejme dva argumenta. Tako Consumer kot Bi-Consumer nimata povratne vrednosti. Prav tako ne vrne ničesar tako kot uporabniški vmesnik. Uporablja se pri ponavljanju vnosov zemljevida.
Sintaksa / prototip potrošniškega funkcionalnega vmesnika –
Consumer consumer = (value) ->System.out.println(vrednost);>
Ta izvedba funkcijskega vmesnika Java Consumer natisne vrednost, posredovano kot parameter v stavku za tiskanje. Ta izvedba uporablja funkcijo Lambda v Javi.
2. Predikat
V znanstveni logiki je funkcija, ki sprejme argument in v zameno generira logično vrednost kot odgovor, znana kot predikat. Podobno je v programskem jeziku Java predikatni funkcionalni vmesnik Jave vrsta funkcije, ki sprejme eno samo vrednost ali argument in jo obdela na neki način ter vrne logični odgovor (True/False). Implementacija funkcionalnega vmesnika Predicate zajema tudi logiko filtriranja (proces, ki se uporablja za filtriranje komponent toka na podlagi podanega predikata) v Javi.
Tako kot funkcijski vmesnik Consumer ima tudi funkcijski vmesnik Predicate nekaj razširitev. To so IntPredicate, DoublePredicate in LongPredicate. Te vrste predikatnih funkcionalnih vmesnikov kot argumente sprejemajo samo primitivne vrste podatkov ali vrednosti.
Bi-predikat – Bi-Predicate je tudi razširitev funkcionalnega vmesnika Predicate, ki namesto enega sprejme dva argumenta, opravi nekaj obdelave in vrne logično vrednost.
Sintaksa predikatnega funkcionalnega vmesnika –
public interface Predicate { boolean test(T t); }>
Predikatni funkcionalni vmesnik je mogoče implementirati tudi z uporabo razreda. Sintaksa za implementacijo predikatnega funkcionalnega vmesnika z uporabo razreda je podana spodaj –
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>
Funkcionalni vmesnik predikata Java je mogoče implementirati tudi z uporabo izrazov Lambda. Spodaj je podan primer implementacije funkcionalnega vmesnika Predicate –
Predicate predicate = (value) ->vrednost != null;>
Ta izvedba funkcionalnih vmesnikov v Javi z uporabo izrazov Java Lambda je bolj obvladljiva in učinkovita kot tista, ki se izvaja z uporabo razreda, saj obe izvedbi opravljata isto delo, tj. vračata enak izhod.
3. Funkcija
Funkcija je vrsta funkcionalnega vmesnika v Javi, ki prejme samo en argument in po zahtevani obdelavi vrne vrednost. Obstaja veliko različic funkcijskih vmesnikov, ker primitivni tip ne more implicirati argumenta splošnega tipa, zato potrebujemo te različice funkcijskih vmesnikov. Veliko različnih različic funkcijskih vmesnikov je instrumentalnih in se običajno uporabljajo v primitivnih tipih, kot so double, int, long. V argumentu so uporabljena tudi različna zaporedja teh primitivnih tipov.
Te različice so:
Bi-funkcija
Bi-funkcija je bistveno povezana s funkcijo. Poleg tega potrebuje dva argumenta, medtem ko funkcija sprejme en argument.
Prototip in sintaksa Bi-Function sta podana spodaj –
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>
V zgornji kodi vmesnika sta T in U vhoda in obstaja samo en izhod, ki je R.
Unarni in binarni operator
Obstajata tudi dva druga funkcionalna vmesnika, ki se imenujeta Unarni operater in Binarni operater. Oba razširjata Function oziroma Bi-Function. Preprosto povedano, unarni operator razširja funkcijo, binarni operator pa dvofunkcijo.
Spodaj je omenjen prototip unarnega in binarnega operaterja:
jaz. Unarni operater
@FunctionalInterface public interface UnaryOperator extends Function { ……... }>
ii . Binarni operator
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>
Pred zgornjim primerom lahko razumemo, da unarni operator sprejme samo en argument in vrne samo en argument. Kljub temu morajo biti v unarnem operaterju vhodne in izhodne vrednosti enake in istega tipa.
Po drugi strani pa binarni operator sprejme dve vrednosti in vrne eno vrednost, ki je primerljiva z bi-funkcijo, vendar je podobna unarnemu operatorju, vrsti vhodne in izhodne vrednosti pa morata biti enaki in istega tipa.
4. Dobavitelj
Funkcionalni vmesnik dobavitelja je tudi vrsta funkcionalnega vmesnika, ki ne sprejema nobenega vnosa ali argumenta, vendar vrne en sam izhod. Ta vrsta funkcionalnega vmesnika se običajno uporablja pri lenobnem ustvarjanju vrednosti. Funkcionalni vmesniki dobavitelja se uporabljajo tudi za definiranje logike za generiranje poljubnega zaporedja. Na primer – logiko za Fibonaccijevo serijo je mogoče ustvariti s pomočjo toka. Generate metodo, ki jo implementira funkcionalni vmesnik dobavitelja.
Različne razširitve funkcijskega vmesnika Supplier vsebujejo številne druge funkcije dobaviteljev, kot so BooleanSupplier, DoubleSupplier, LongSupplier in IntSupplier. Povratni tip vseh teh nadaljnjih specializacij je le njihovih ustreznih primitivov.
Sintaksa / prototip funkcionalnega vmesnika dobavitelja je –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>
Spodaj je izvedba zgornje teme:
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);> > }> > }> }> |
>
>
java podniz vsebujeIzhod
Geek GeeksQuiz Geek2>
Pomembne točke/opažanje ns:
Tukaj je nekaj pomembnih točk v zvezi s funkcionalnimi vmesniki v Javi:
- V funkcionalnih vmesnikih je podprta samo ena abstraktna metoda. Če opomba funkcijskega vmesnika, tj. @FunctionalInterface, ni implementirana ali napisana s funkcijskim vmesnikom, je v njem mogoče deklarirati več kot eno abstraktno metodo. Vendar se v tej situaciji z več kot eno funkcijo ta vmesnik ne bo imenoval funkcionalni vmesnik. Imenuje se nefunkcionalni vmesnik.
- Opomba @FunctionalInterface ni potrebna, saj je samo prostovoljna. To je napisano, ker pomaga pri preverjanju ravni prevajalnika. Poleg tega je izbirno.
- Funkcionalnemu vmesniku je mogoče dodati neskončno število metod (statičnih ali privzetih). Preprosto povedano, ni omejitev za funkcionalni vmesnik, ki vsebuje statične in privzete metode.
- Preglasitev metod iz nadrejenega razreda ne krši pravil funkcionalnega vmesnika v Javi.
- The java.util.function paket vsebuje številne vgrajene funkcionalne vmesnike v Javi 8.