Funkcionalni vmesnik v Javi je vmesnik, ki vsebuje samo eno abstraktno metodo. Funkcionalni vmesniki imajo lahko več privzetih ali statičnih metod, vendar samo eno abstraktno metodo.
Od Jave 8 naprej je mogoče za predstavitev primerka funkcionalnega vmesnika uporabiti lambda izraze in reference metod.
Primer: uporaba funkcionalnega vmesnika z lambda izrazom
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Izhod
New thread created
Pojasnilo:
- Zgornji program prikazuje uporabo lambda izraza s funkcionalnim vmesnikom Runnable.
- Runnable ima eno abstraktno metodo run(), zato se kvalificira kot funkcionalni vmesnik.
- Lambda ()-> System.out.println('Ustvarjena nova nit') definira metodo run().
- new Thread().start() zažene novo nit, ki izvaja telo lambda
Opomba:
A f nefunkcionalni vmesnik lahko razširi tudi drug funkcionalni vmesnik.
@Funkcijski vmesnik Opomba
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.
Opomba:
Opomba @FunctionalInterface ni obvezna, vendar jo je dobro uporabiti. Pomaga odkriti napako v zgodnji fazi, tako da poskrbi, da ima vmesnik samo eno abstraktno metodo.
Primer: Definiranje funkcionalnega vmesnika z opombo @FunctionalInterface
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); } }
Izhod
25
Pojasnilo :
- Square je funkcionalni vmesnik z eno samo metodo izračuna (int x).
- Lambda izraz (int x) -> x * x se uporablja za izvedbo metode izračuna.
- Lambda sprejme x kot vhod in vrne x * x.
Funkcionalni vmesniki Jave pred Javo 8
Pred Javo 8 smo morali ustvariti anonimne objekte notranjega razreda ali implementirati te vmesnike. Spodaj je primer, kako je bil vmesnik Runnable implementiran pred uvedbo lambda izrazov.
primer: Program Java za predstavitev funkcionalnega vmesnika
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(); } }
Izhod
New thread created
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:
- Izvedljivo: Ta vmesnik vsebuje samo teči() metoda.
- Primerljivo: Ta vmesnik vsebuje samo metodo compareTo().
- ActionListener: Ta vmesnik vsebuje samo metodo actionPerformed().
- Klicati: Ta vmesnik vsebuje samo metodo call().
Vrste funkcionalnih vmesnikov v Javi
Java SE 8 je vključevala štiri glavne vrste funkcionalnih vmesnikov, ki jih je mogoče uporabiti v več situacijah, kot je navedeno spodaj:
povratni tip v Javi
- Potrošnik
- Predikat
- funkcija
- Dobavitelj
1. Potrošnik
The potrošniški vmesnik funkcionalnega vmesnika je tisti, ki sprejme le 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 potrošniškega vmesnika, znana kot Dvopotrošnik .
Sintaksa:
Potrošnik
potrošnik = (vrednost) -> 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
The Predikatni vmesnik predstavlja funkcijo enega argumenta z logično vrednostjo. Običajno se uporablja za operacije filtriranja v tokovih. Tako kot potrošniški funkcionalni vmesnik ima tudi predikatni funkcionalni vmesnik nekaj razširitev. To so IntPredicate DoublePredicate in Dolgi predikat . Te vrste predikatnih funkcionalnih vmesnikov kot argumente sprejemajo samo primitivne vrste podatkov ali vrednosti.
Sintaksa:
javni vmesnik Predikat
{
logični test (T t);
}
Funkcionalni vmesnik predikata Java je mogoče implementirati tudi z uporabo izrazov Lambda.
Predikat
predikat = (vrednost) -> vrednost != nič; gostitelj linux
3. Funkcija
A funkcijo je vrsta funkcionalnega vmesnika v Javi, ki prejme le en argument in po zahtevani obdelavi vrne vrednost. Veliko različnih različic funkcijskih vmesnikov je instrumentalnih in se običajno uporabljajo v primitivnih tipih, kot je dvojno int long.
Sintaksa:
funkcija
funkcija = (vrednost) -> vrednost * vrednost;
- Bi-funkcija: The Bi-funkcija je bistveno povezano s funkcijo. Poleg tega potrebuje dva argumenta, medtem ko funkcija sprejme en argument.
- Unarni in binarni operator: Obstajata tudi dva druga funkcionalna vmesnika, ki sta poimenovana kot Unarni operater in Binarni operator. Oba razširjata funkcijo in bi-funkcijo, kjer sta vhodna in izhodna vrsta enaki.
4. Dobavitelj
The Dobavitelj funkcionalni vmesnik je tudi vrsta funkcionalnega vmesnika, ki ne sprejema nobenega vnosa ali argumenta, vendar vrne en sam izhod. Različne razširitve funkcionalnega vmesnika dobavitelja vsebujejo številne druge funkcije dobavitelja, npr BooleanSupplier DoubleSupplier LongSupplier in IntSupplier . Povratni tip vseh teh nadaljnjih specializacij je le njihovih ustreznih primitivov.
Sintaksa:
Dobavitelj
dobavitelj = () -> 'Pozdravljen svet!';
primer: Uporaba predikatnega vmesnika za filtriranje nizov
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); } } }
Izhod
Geek GeeksQuiz Geek2
Tabela funkcionalnih vmesnikov
Funkcionalni vmesniki | Opis | Metoda |
|---|---|---|
Izvedljivo | Predstavlja nalogo, ki jo lahko izvede nit. | void run() |
Primerljivo | Primerja dva predmeta za naročanje. | int compareTo(T o) |
ActionListener | Obravnava akcijski dogodek v programiranju, ki ga vodi dogodek. | void actionPerformed(ActionEvent e) |
Kličljivo cdr polna oblika | Predstavlja nalogo, ki lahko vrne rezultat ali povzroči izjemo. | V call() vrže izjemo |
Potrošnik | Sprejme en sam vhodni argument in ne vrne nobenega rezultata. | sprejeti nič (T t) |
Predikat | Sprejme en sam argument in vrne logični rezultat. | logični test (T t) |
funkcija | Sprejme en argument in vrne rezultat. imessage igre na androidu | R uporabi (T t) |
Dobavitelj | Ne zahteva nobenih argumentov, ampak zagotavlja rezultat. | T get() |
BiConsumer | Sprejme dva argumenta in ne vrne nobenega rezultata. | void accept(T t U u) |
Bipredikat | Sprejme dva argumenta in vrne logični rezultat. | logični test (T t U u) |
BiFunction | Sprejme dva argumenta in vrne rezultat. centos vs redhat | R uporabi (T t U u) |
UnaryOperator | To je poseben primer funkcije, kjer sta vhodni in izhodni tip enaka. | T uporabi (T t) |
BinaryOperator | To je poseben primer BiFunction, kjer sta vhodni in izhodni tip enaka. | T uporabi (T t1 T t2) |
Sorodni članki
- Java 8
- Lambda izrazi Java