logo

Funktionelle grænseflader i Java

Java har for altid forblevet et objektorienteret programmeringssprog. Ved objektorienteret programmeringssprog kan vi erklære, at alt, der findes i Java-programmeringssproget, roterer gennem objekterne, bortset fra nogle af de primitive datatyper og primitive metoder til integritet og enkelhed. Der er ingen udelukkende funktioner til stede i et programmeringssprog kaldet Java. Funktioner i programmeringssproget Java er en del af en klasse, og hvis nogen vil bruge dem, skal de bruge klassens klasse eller objekt til at kalde en funktion.

Java funktionelle grænseflader

EN funktionel grænseflade er en grænseflade, der kun indeholder én abstrakt metode. De kan kun have én funktionalitet at udstille. Fra Java 8 og fremefter lambda udtryk kan bruges til at repræsentere forekomsten af ​​en funktionel grænseflade. En funktionel grænseflade kan have et hvilket som helst antal standardmetoder. Kørbar , ActionListener , og Sammenlignelig er nogle af eksemplerne på funktionelle grænseflader.



10 af 100

Funktionel grænseflade er desuden anerkendt som Enkelte abstrakte metodegrænseflader . Kort sagt er de også kendt som SAM-grænseflader . Funktionelle grænseflader i Java er den nye funktion, der giver brugerne tilgang til grundlæggende programmering.

Funktionelle grænseflader er inkluderet i Java SE 8 med Lambda-udtryk og Metodereferencer for at gøre koden mere læsbar, ren og ligetil. Funktionelle grænseflader er grænseflader, der sikrer, at de kun indeholder én abstrakt metode. Funktionelle grænseflader bruges og udføres ved at repræsentere grænsefladen med en anmærkning kaldet @Functional Interface . Som beskrevet tidligere kan funktionelle grænseflader kun indeholde én abstrakt metode. De kan dog inkludere en hvilken som helst mængde standard- og statiske metoder.

I funktionelle grænseflader er det ikke nødvendigt at bruge det abstrakte nøgleord, da det er valgfrit at bruge det abstrakte nøgleord, fordi den metode, der er defineret i grænsefladen, som standard kun er abstrakt. Vi kan også kalde Lambda-udtryk som forekomsten af ​​funktionel grænseflade.



Eksempel på Java-funktionelle grænseflader

Eksempel 1:

Før Java 8 var vi nødt til at oprette anonyme indre klasseobjekter eller implementere disse grænseflader.

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();> >}> }>

>

>

Produktion

New thread created>

Eksempel 2:

Java 8 og fremefter, kan vi tildele lambda udtryk til dets funktionelle grænsefladeobjekt som dette:

Java




opdatering fra join sql

// 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();> >}> }>

>

>

Produktion

New thread created>

@Functional Interface Annotation

@FunctionalInterface-annotering bruges til at sikre, at den funktionelle grænseflade ikke kan have mere end én abstrakt metode. Hvis der er mere end én abstrakt metode til stede, markerer compileren en 'Uventet @FunctionalInterface-annotation'-meddelelse. Det er dog ikke obligatorisk at bruge denne anmærkning.

Nedenfor er implementeringen af ​​ovenstående emne:

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);> >}> }>

>

>

Produktion

25>

Nogle indbyggede Java-funktionelle grænseflader

Siden Java SE 1.8 og frem er der mange grænseflader, der er konverteret til funktionelle grænseflader. Alle disse grænseflader er kommenteret med @FunctionalInterface. Disse grænseflader er som følger -

    Kørbar –> Denne grænseflade indeholder kun metoden run(). Sammenlignelig –> Denne grænseflade indeholder kun compareTo()-metoden. ActionListener –> Denne grænseflade indeholder kun actionPerformed() metoden. Callable –> Denne grænseflade indeholder kun call() metoden.

Java SE 8 inkluderede fire hovedtyper af funktionelle grænseflader som kan anvendes i flere situationer som nævnt nedenfor:

    Forbrugerprædikatfunktionsleverandør

Midt i de foregående fire grænseflader har de første tre grænseflader, dvs. forbruger, prædikat og funktion, ligeledes tilføjelser, der er angivet nedenfor -

  1. Forbruger -> Bi-Forbruger
  2. Prædikat -> Bi-prædikat
  3. Funktion -> Bi-funktion, unær operatør, binær operatør

1. Forbruger

Forbrugergrænsefladen for den funktionelle grænseflade er den, der kun accepterer ét argument eller et gentrificeret argument. Forbrugergrænsefladen har ingen returværdi. Det giver intet tilbage. Der er også funktionelle varianter af Consumer - DoubleConsumer, IntConsumer og LongConsumer. Disse varianter accepterer primitive værdier som argumenter.

Ud over disse varianter er der også en variant mere af forbrugergrænsefladen kendt som Bi-Consumer.

Bi-forbruger – Bi-Consumer er den mest spændende variant af Consumer-grænsefladen. Forbrugergrænsefladen tager kun ét argument, men på den anden side tager Bi-Consumer-grænsefladen to argumenter. Både Consumer og Bi-Consumer har ingen returværdi. Det returnerer heller ikke noget ligesom forbrugergrænsefladen. Det bruges til at gentage kortets indtastninger.

Syntaks / prototype af forbrugerens funktionelle grænseflade –

Consumer consumer = (value) ->System.out.println(værdi);>

Denne implementering af Java Consumer-funktionsgrænsefladen udskriver værdien, der sendes som en parameter til print-sætningen. Denne implementering bruger Lambda-funktionen i Java.

2. Prædikat

I videnskabelig logik er en funktion, der accepterer et argument og til gengæld genererer en boolsk værdi som et svar, kendt som et prædikat. Tilsvarende i Java-programmeringssproget er en prædikatfunktionel grænseflade for Java en type funktion, der accepterer en enkelt værdi eller et argument og udfører en form for behandling på det, og returnerer et boolesk (sandt/falskt) svar. Implementeringen af ​​prædikatets funktionelle grænseflade indkapsler også logikken i filtrering (en proces, der bruges til at filtrere strømkomponenter på basis af et givet prædikat) i Java.

Ligesom Consumer funktionel interface, har Predicate funktionel interface også nogle udvidelser. Disse er IntPredicate, DoublePredicate og LongPredicate. Disse typer prædikatfunktionelle grænseflader accepterer kun primitive datatyper eller værdier som argumenter.

Bi-prædikat – Bi-prædikat er også en udvidelse af prædikatets funktionelle grænseflade, som i stedet for ét tager to argumenter, behandler noget og returnerer den boolske værdi.

Syntaks for prædikatfunktionelt interface –

public interface Predicate { boolean test(T t); }>

Prædikatets funktionelle grænseflade kan også implementeres ved hjælp af en klasse. Syntaksen for implementering af prædikatfunktionel grænseflade ved hjælp af en klasse er givet nedenfor -

public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>

Java-prædikatets funktionelle grænseflade kan også implementeres ved hjælp af Lambda-udtryk. Et eksempel på implementeringen af ​​prædikatets funktionelle grænseflade er givet nedenfor -

Predicate predicate = (value) ->værdi != null;>

Denne implementering af funktionelle grænseflader i Java ved hjælp af Java Lambda-udtryk er mere håndterbar og effektiv end den, der implementeres ved hjælp af en klasse, da begge implementeringer udfører det samme arbejde, dvs. returnerer det samme output.

3. Funktion

En funktion er en type funktionel grænseflade i Java, der kun modtager et enkelt argument og returnerer en værdi efter den påkrævede behandling. Der er mange versioner af funktionsgrænseflader, fordi en primitiv type ikke kan antyde et generelt typeargument, så vi har brug for disse versioner af funktionsgrænseflader. Mange forskellige versioner af funktionsgrænseflader er instrumentelle og bruges almindeligvis i primitive typer som double, int, long. De forskellige sekvenser af disse primitive typer bruges også i argumentationen.

Disse versioner er:

Bi-funktion

Bi-funktionen er væsentligt relateret til en funktion. Desuden kræver det to argumenter, mens Funktion accepterer et argument.

Prototypen og syntaksen for Bi-Function er givet nedenfor -

liste på java
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>

I ovenstående grænsefladekode er T og U indgangene, og der er kun én udgang, som er R.

Unær operatør og binær operatør

Der er også to andre funktionelle grænseflader, som hedder Unary Operator og Binary Operator. De udvider begge henholdsvis funktion og bi-funktion. Med enkle ord udvider Unary Operator Funktion, og Binær Operator udvider Bi-Function.

Prototypen af ​​Unary Operator og Binary Operator er nævnt 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 ovenstående eksempel, at Unary Operator kun accepterer ét argument og returnerer kun et enkelt argument. Alligevel skal både input- og outputværdierne i Unary Operator være identiske og af samme type.

På den anden måde tager Binær Operator to værdier og returnerer én værdi, der kan sammenlignes med Bi-Function, men svarende til en Unær Operator, skal input- og outputværdityperne være identiske og af samme type.

4. Leverandør

Leverandørens funktionelle grænseflade er også en type funktionel grænseflade, der ikke tager noget input eller argument og alligevel returnerer et enkelt output. Denne type funktionel grænseflade bruges generelt i den dovne generering af værdier. Leverandørfunktionelle grænseflader bruges også til at definere logikken for genereringen af ​​enhver sekvens. For eksempel – Logikken bag Fibonacci-serien kan genereres ved hjælp af Stream. generere metode, som implementeres af Leverandørens funktionelle grænseflade.

De forskellige udvidelser af leverandørens funktionelle grænseflade rummer mange andre leverandørfunktioner som BooleanSupplier, DoubleSupplier, LongSupplier og IntSupplier. Returtypen for alle disse yderligere specialiseringer er kun deres tilsvarende primitiver.

Syntaks / prototype af leverandørens funktionelle grænseflade er –

@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>

Nedenfor er implementeringen af ​​ovenstående emne:

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);> >}> >}> }>

>

>

Produktion

755 chmod
Geek GeeksQuiz Geek2>

Vigtige pointer/observationer ns:

Her er nogle vigtige punkter vedrørende funktionelle grænseflader i Java:

  1. I funktionelle grænseflader er der kun én abstrakt metode, der understøttes. Hvis annoteringen af ​​en funktionel grænseflade, dvs. @FunctionalInterface, ikke er implementeret eller skrevet med en funktionsgrænseflade, kan mere end én abstrakt metode erklæres inde i den. Men i denne situation med mere end én funktion, vil denne grænseflade ikke blive kaldt en funktionel grænseflade. Det kaldes en ikke-funktionel grænseflade.
  2. Der er ikke et sådant behov for @FunctionalInterface-annotationen, da den kun er frivillig. Dette er skrevet, fordi det hjælper med at kontrollere compilerniveauet. Udover dette er det valgfrit.
  3. Et uendeligt antal metoder (uanset om det er statisk eller standard) kan tilføjes til den funktionelle grænseflade. Med enkle ord er der ingen grænse for en funktionel grænseflade, der indeholder statiske og standardmetoder.
  4. Tilsidesættelse af metoder fra den overordnede klasse overtræder ikke reglerne for en funktionel grænseflade i Java.
  5. Det java.util.funktion pakken indeholder mange indbyggede funktionelle grænseflader i Java 8.