En funktionel grænseflade i Java er en grænseflade, der kun indeholder én abstrakt metode. Funktionelle grænseflader kan have flere standardmetoder eller statiske metoder, men kun én abstrakt metode.
Fra Java 8 og fremefter kan lambda-udtryk og metodereferencer bruges til at repræsentere forekomsten af en funktionel grænseflade.
Eksempel: Brug af en funktionel grænseflade med lambdaudtryk
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Produktion
New thread created
Forklaring:
- Ovenstående program demonstrerer brugen af lambda-udtryk med den funktionelle interface til Runnable.
- Runnable har én abstrakt metode run(), så den kvalificerer sig som en funktionel grænseflade.
- Lambda ()-> System.out.println('Ny tråd oprettet') definerer run()-metoden.
- new Thread().start() starter en ny tråd, der udfører lambda-kroppen
Note:
EN f unctional grænseflade kan også udvide en anden funktionel grænseflade.
@Functional Interface Anmærkning
@FunctionalInterface annotation 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.
Note:
fuld hugorm
@FunctionalInterface-annotering er valgfri, men det er en god praksis at bruge. Det hjælper med at fange fejlen på et tidligt tidspunkt ved at sikre, at grænsefladen kun har én abstrakt metode.
Eksempel: Definering af en funktionel grænseflade med @FunctionalInterface-annotering
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); } }
Produktion
25
Forklaring :
- Square er en funktionel grænseflade med en enkelt metode calculate(int x).
- Et lambda-udtryk (int x) -> x * x bruges til at implementere beregningsmetoden.
- Lambda tager x som input og returnerer x * x.
Java funktionelle grænseflader før Java 8
Før Java 8 skulle vi oprette anonyme indre klasseobjekter eller implementere disse grænseflader. Nedenfor er et eksempel på, hvordan Runnable-grænsefladen blev implementeret før introduktionen af lambda-udtryk.
Eksempel: Java-program til at demonstrere funktionel grænseflade
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(); } }
Produktion
New thread created
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 løbe() metode.
- Sammenlignelig: Denne grænseflade indeholder kun compareTo() metoden.
- ActionListener: Denne grænseflade indeholder kun actionPerformed() metoden.
- Kaldes: Denne grænseflade indeholder kun metoden call().
Typer af funktionelle grænseflader i Java
Java SE 8 inkluderede fire hovedtyper af funktionelle grænseflader, som kan anvendes i flere situationer som nævnt nedenfor:
- Forbruger
- Prædikat
- Fungere
- Leverandør
1. Forbruger
De forbrugergrænseflade af 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 findes også funktionelle varianter af Consumer DoubleConsumer IntConsumer og Langforbruger . Disse varianter accepterer primitive værdier som argumenter.
Ud over disse varianter er der også en variant mere af forbrugergrænsefladen kendt som Bi-forbruger .
Syntaks:
Forbruger
forbruger = (værdi) -> 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
De Prædikatgrænseflade repræsenterer en boolsk værdi af et argument. Det bruges almindeligvis til filtreringsoperationer i strømme. Ligesom Consumer functional interface har Predicate funktionelle interface også nogle udvidelser. Disse er Intprædikat Dobbeltprædikat og Langt Prædikat . Disse typer prædikatfunktionelle grænseflader accepterer kun primitive datatyper eller værdier som argumenter.
Syntaks:
offentlig grænseflade prædikat
{
boolsk test(Tt);
}
Java-prædikatets funktionelle grænseflade kan også implementeres ved hjælp af Lambda-udtryk.
Prædikat
prædikat = (værdi) -> værdi != null;
3. Funktion
EN fungere 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. Mange forskellige versioner af funktionsgrænseflader er instrumentelle og bruges almindeligvis i primitive typer som double int long.
Syntaks:
Fungere
funktion = (værdi) -> værdi * værdi;
- Bi-funktion: De Bi-funktion er væsentligt relateret til en funktion. Derudover kræver det to argumenter, mens Funktion accepterer et argument.
- Unær operatør og binær operatør: Der er også to andre funktionelle grænseflader, som er navngivet som Unær operatør og Binær operatør. De udvider begge henholdsvis funktion og bi-funktion, hvor både input- og output-typen er de samme.
4. Leverandør
De Leverandør funktionel grænseflade er også en type funktionel grænseflade, der ikke tager noget input eller argument og alligevel returnerer et enkelt output. De forskellige udvidelser af leverandørens funktionelle grænseflade rummer mange andre leverandørfunktioner som f.eks Boolean Leverandør DoubleSupplier LongSupplier og IntSupplier . Returtypen for alle disse yderligere specialiseringer er kun deres tilsvarende primitiver.
Syntaks:
Leverandør
leverandør = () -> 'Hej verden!';
Eksempel: Brug af prædikatgrænseflade til at filtrere strenge
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); } } }
Produktion
Geek GeeksQuiz Geek2
Tabel med funktionelle grænseflader
Funktionelle grænseflader | Beskrivelse | Metode |
|---|---|---|
Kørbar | Det repræsenterer en opgave, der kan udføres af en tråd. | void run() |
Sammenlignelig | Den sammenligner to objekter til bestilling. | int compareTo(T o) |
ActionListener | Den håndterer en handlingsbegivenhed i begivenhedsdrevet programmering. | void handlingUdført(ActionEvent e) |
Ringbar | Det repræsenterer en opgave, der kan returnere et resultat eller give en undtagelse. | V call() kaster Undtagelse |
Forbruger | Det accepterer et enkelt input-argument og returnerer intet resultat. | void accept(T t) |
Prædikat | Det accepterer et enkelt argument og returnerer et boolsk resultat. | boolsk test(T t) |
Fungere | Den accepterer et enkelt argument og returnerer et resultat. | R anvende(T t) |
Leverandør | Det kræver ingen argumenter, men giver et resultat. | T få() |
BiConsumer | Den accepterer to argumenter og giver intet resultat. | void accept(T t U u) |
Biprædikat | Den accepterer to argumenter og returnerer et boolsk resultat. | boolsk test(T t U u) |
BiFunktion | Den accepterer to argumenter og returnerer et resultat. latex tekststørrelse | R anvende(T t U u) |
UnaryOperator | Dette er et særligt tilfælde af funktion, hvor input- og outputtyper er de samme. | T anvende (T t) |
Binær operatør | Dette er et særligt tilfælde af BiFunction, hvor input- og outputtyper er de samme. | T gælder (T t1 T t2) |
Relaterede artikler
- Java 8
- Java Lambda udtryk