Java har for alltid vært et objektorientert programmeringsspråk. Med objektorientert programmeringsspråk kan vi erklære at alt som finnes i programmeringsspråket Java roterer gjennom objektene, bortsett fra noen av de primitive datatypene og primitive metodene for integritet og enkelhet. Det er ingen funksjoner utelukkende i et programmeringsspråk kalt Java. Funksjoner i programmeringsspråket Java er en del av en klasse, og hvis noen vil bruke dem, må de bruke klassen eller objektet til klassen for å kalle en hvilken som helst funksjon.
Java funksjonelle grensesnitt
EN funksjonelt grensesnitt er et grensesnitt som kun inneholder én abstrakt metode. De kan bare ha én funksjonalitet å vise frem. Fra Java 8 og utover, lambda-uttrykk kan brukes til å representere forekomsten av et funksjonelt grensesnitt. Et funksjonelt grensesnitt kan ha et hvilket som helst antall standardmetoder. Kjørbar , ActionListener , og Sammenlignbar er noen av eksemplene på funksjonelle grensesnitt.
10 av 100
Funksjonelt grensesnitt er i tillegg anerkjent som Enkelt abstrakt metodegrensesnitt . Kort sagt er de også kjent som SAM-grensesnitt . Funksjonelle grensesnitt i Java er den nye funksjonen som gir brukerne tilnærmingen til grunnleggende programmering.
Funksjonelle grensesnitt er inkludert i Java SE 8 med Lambda-uttrykk og metodereferanser for å gjøre koden mer lesbar, ren og grei. Funksjonelle grensesnitt er grensesnitt som sikrer at de bare inkluderer én abstrakt metode. Funksjonelle grensesnitt brukes og utføres ved å representere grensesnittet med en anmerkning kalt @FunctionalInterface . Som beskrevet tidligere kan funksjonelle grensesnitt inneholde bare én abstrakt metode. Imidlertid kan de inkludere en hvilken som helst mengde standard og statiske metoder.
I funksjonelle grensesnitt er det ikke nødvendig å bruke det abstrakte nøkkelordet, da det er valgfritt å bruke det abstrakte nøkkelordet fordi metoden som er definert i grensesnittet, som standard kun er abstrakt. Vi kan også kalle Lambda-uttrykk som forekomsten av funksjonelt grensesnitt.
Eksempel på Java funksjonelle grensesnitt
Eksempel 1:
Før Java 8 måtte vi lage anonyme indre klasseobjekter eller implementere disse grensesnittene.
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();> > }> }> |
>
>Produksjon
New thread created>
Eksempel 2:
Java 8 og utover, kan vi tildele lambda uttrykk til det funksjonelle grensesnittobjektet slik:
Java
erstatte strengen i 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();> > }> }> |
>
>Produksjon
New thread created>
@FunctionalInterface-kommentar
@FunctionalInterface-annotering brukes for å sikre at det funksjonelle grensesnittet ikke kan ha mer enn én abstrakt metode. I tilfelle mer enn én abstrakt metode er til stede, flagger kompilatoren en 'Uventet @FunctionalInterface-annotering'-melding. Det er imidlertid ikke obligatorisk å bruke denne merknaden.
Nedenfor er implementeringen av emnet ovenfor:
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);> > }> }> |
>
>Produksjon
25>
Noen innebygde Java funksjonelle grensesnitt
Siden Java SE 1.8 og utover er det mange grensesnitt som konverteres til funksjonelle grensesnitt. Alle disse grensesnittene er merket med @FunctionalInterface. Disse grensesnittene er som følger -
- Kjørbar –> Dette grensesnittet inneholder bare run()-metoden. Comparable –> Dette grensesnittet inneholder bare compareTo()-metoden. ActionListener –> Dette grensesnittet inneholder bare actionPerformed()-metoden. Callable –> Dette grensesnittet inneholder bare call()-metoden.
Java SE 8 inkluderte fire hovedtyper funksjonelle grensesnitt som kan brukes i flere situasjoner som nevnt nedenfor:
- Leverandør av forbrukerpredikatfunksjon
Blant de foregående fire grensesnittene har de tre første grensesnittene, dvs. Consumer, Predicate og Function, også tillegg som er gitt under -
- Forbruker -> Bi-forbruker
- Predikat -> Bi-predikat
- Funksjon -> Bi-Funksjon, Unær Operator, Binær Operator
1. Forbruker
Forbrukergrensesnittet til det funksjonelle grensesnittet er det som aksepterer bare ett argument eller et gentrifisert argument. Forbrukergrensesnittet har ingen returverdi. Det gir ingenting tilbake. Det finnes også funksjonelle varianter av Consumer - DoubleConsumer, IntConsumer og LongConsumer. Disse variantene aksepterer primitive verdier som argumenter.
Annet enn disse variantene, er det også en variant til av Consumer-grensesnittet kjent som Bi-Consumer.
Bi-forbruker – Bi-Consumer er den mest spennende varianten av Consumer-grensesnittet. Forbrukergrensesnittet tar bare ett argument, men på den andre siden tar Bi-Consumer-grensesnittet to argumenter. Både Consumer og Bi-Consumer har ingen returverdi. Den returnerer heller ingenting akkurat som forbrukergrensesnittet. Den brukes til å iterere gjennom oppføringene på kartet.
Syntaks / prototype av forbrukerfunksjonelt grensesnitt –
Consumer consumer = (value) ->System.out.println(verdi);>
Denne implementeringen av Java Consumer funksjonelle grensesnitt skriver ut verdien som sendes som en parameter til utskriftssetningen. Denne implementeringen bruker Lambda-funksjonen til Java.
2. Predikat
I vitenskapelig logikk er en funksjon som aksepterer et argument og til gjengjeld genererer en boolsk verdi som et svar kjent som et predikat. Tilsvarende, i programmeringsspråket Java, er et funksjonelt grensesnitt for predikat til Java en type funksjon som aksepterer en enkelt verdi eller argument og utfører en slags prosessering på det, og returnerer et boolsk (sant/usant) svar. Implementeringen av det funksjonelle grensesnittet Predicate innkapsler også logikken til filtrering (en prosess som brukes til å filtrere strømkomponenter på grunnlag av et gitt predikat) i Java.
Akkurat som Consumer funksjonelt grensesnitt, Predicate funksjonelle grensesnitt har også noen utvidelser. Disse er IntPredicate, DoublePredicate og LongPredicate. Disse typene funksjonelle predikatgrensesnitt aksepterer bare primitive datatyper eller verdier som argumenter.
Bi-predikat – Bi-Predicate er også en utvidelse av Predicate funksjonelle grensesnitt, som, i stedet for ett, tar to argumenter, gjør noe prosessering og returnerer den boolske verdien.
Syntaks for predikat funksjonelt grensesnitt –
public interface Predicate { boolean test(T t); }>
Predikatets funksjonelle grensesnitt kan også implementeres ved hjelp av en klasse. Syntaksen for implementering av predikatfunksjonelt grensesnitt ved bruk av en klasse er gitt nedenfor -
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>
Java-predikatets funksjonelle grensesnitt kan også implementeres ved hjelp av Lambda-uttrykk. Et eksempel på implementeringen av Predicate funksjonelle grensesnitt er gitt nedenfor -
Predicate predicate = (value) ->verdi != null;>
Denne implementeringen av funksjonelle grensesnitt i Java ved hjelp av Java Lambda-uttrykk er mer håndterlig og effektiv enn den som implementeres ved bruk av en klasse, da begge implementeringene gjør det samme arbeidet, dvs. returnerer samme utdata.
3. Funksjon
En funksjon er en type funksjonelt grensesnitt i Java som mottar bare et enkelt argument og returnerer en verdi etter den nødvendige behandlingen. Det er mange versjoner av funksjonsgrensesnitt fordi en primitiv type ikke kan innebære et generelt typeargument, så vi trenger disse versjonene av funksjonsgrensesnitt. Mange forskjellige versjoner av funksjonsgrensesnittene er instrumentelle og brukes ofte i primitive typer som dobbel, int, lang. De forskjellige sekvensene til disse primitive typene brukes også i argumentasjonen.
Disse versjonene er:
Bi-funksjon
Bi-funksjonen er vesentlig relatert til en funksjon. Dessuten krever det to argumenter, mens funksjon godtar ett argument.
Prototypen og syntaksen til Bi-Function er gitt nedenfor -
samlinger java
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>
I grensesnittkoden ovenfor er T og U inngangene, og det er bare én utgang som er R.
Unær operatør og binær operatør
Det er også to andre funksjonelle grensesnitt som heter Unary Operator og Binary Operator. De utvider begge funksjonen og bi-funksjonen. Med enkle ord utvider Unary Operator funksjon, og binær operatør utvider Bi-Function.
Prototypen til Unary Operator og Binary Operator er nevnt nedenfor:
Jeg. Unær operatør
@FunctionalInterface public interface UnaryOperator extends Function { ……... }>
ii . Binær operatør
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>
Vi kan forstå foran eksemplet ovenfor at Unary Operator aksepterer bare ett argument og returnerer bare et enkelt argument. Likevel, i Unary Operator må både inngangs- og utgangsverdiene være identiske og av samme type.
På den andre måten tar binær operatør to verdier og returnerer én verdi som kan sammenlignes med Bi-Function, men lik en unær operatør, må inngangs- og utgangsverditypene være identiske og av samme type.
4. Leverandør
Leverandørens funksjonelle grensesnitt er også en type funksjonelt grensesnitt som ikke tar noen input eller argumenter og likevel returnerer en enkelt utgang. Denne typen funksjonelt grensesnitt brukes vanligvis i den late genereringen av verdier. Leverandørfunksjonelle grensesnitt brukes også for å definere logikken for generering av en hvilken som helst sekvens. For eksempel – Logikken bak Fibonacci-serien kan genereres ved hjelp av Stream. generere metode, som implementeres av leverandørens funksjonelle grensesnitt.
De forskjellige utvidelsene av det funksjonelle leverandørgrensesnittet har mange andre leverandørfunksjoner som BooleanSupplier, DoubleSupplier, LongSupplier og IntSupplier. Returtypen for alle disse ytterligere spesialiseringene er kun deres tilsvarende primitiver.
Syntaks / prototype av leverandørens funksjonelle grensesnitt er –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>
Nedenfor er implementeringen av emnet ovenfor:
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);> > }> > }> }> |
>
>Produksjon
rense npm cache
Geek GeeksQuiz Geek2>
Viktige poeng/observasjon ns:
Her er noen viktige punkter angående funksjonelle grensesnitt i Java:
- I funksjonelle grensesnitt er det bare én abstrakt metode som støttes. Hvis merknaden til et funksjonelt grensesnitt, det vil si @FunctionalInterface, ikke er implementert eller skrevet med et funksjonsgrensesnitt, kan mer enn én abstrakt metode erklæres inne i det. Men i denne situasjonen med mer enn én funksjon, vil ikke det grensesnittet bli kalt et funksjonelt grensesnitt. Det kalles et ikke-funksjonelt grensesnitt.
- Det er ikke noe slikt behov for @FunctionalInterface-kommentaren da den kun er frivillig. Dette er skrevet fordi det hjelper med å sjekke kompilatornivået. I tillegg til dette er det valgfritt.
- Et uendelig antall metoder (enten statiske eller standard) kan legges til det funksjonelle grensesnittet. Med enkle ord er det ingen grense for et funksjonelt grensesnitt som inneholder statiske og standardmetoder.
- Overstyringsmetoder fra den overordnede klassen bryter ikke reglene for et funksjonelt grensesnitt i Java.
- De java.util.function pakken inneholder mange innebygde funksjonelle grensesnitt i Java 8.