A Java funkcionális interfésze olyan felület, amely csak egy absztrakt metódust tartalmaz. A funkcionális interfészek több alapértelmezett vagy statikus metódussal is rendelkezhetnek, de csak egy absztrakt módszerrel.
A Java 8-tól kezdve lambda kifejezések és metódushivatkozások használhatók a funkcionális interfész példányának ábrázolására.
Példa: Funkcionális interfész használata Lambda kifejezéssel
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Kimenet
New thread created
Magyarázat:
- A fenti program bemutatja a lambda kifejezés használatát a Runnable funkcionális felülettel.
- A Runnable egy absztrakt metódussal rendelkezik, a run() így funkcionális interfésznek minősül.
- A Lambda ()-> System.out.println('Új szál létrehozva') határozza meg a run() metódust.
- new Thread().start() egy új szálat indít, amely végrehajtja a lambda törzset
Jegyzet:
A f Az unctional interfész egy másik funkcionális interfészt is kiterjeszthet.
@Funkcionális interfész Annotáció
A @FunctionalInterface annotáció annak biztosítására szolgál, hogy a funkcionális interfész ne rendelkezzen egynél több absztrakt módszerrel. Ha egynél több absztrakt metódus van jelen, a fordító 'Váratlan @FunctionalInterface annotation' üzenetet jelez. Ennek az annotációnak a használata azonban nem kötelező.
Jegyzet:
A @FunctionalInterface megjegyzés nem kötelező, de jó gyakorlat a használata. Segít a hiba korai szakaszban történő elkapásában azáltal, hogy gondoskodik arról, hogy az interfésznek csak egy absztrakt módszere legyen.
Példa: Funkcionális interfész meghatározása @FunctionalInterface megjegyzéssel
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); } }
Kimenet
25
Magyarázat :
- A Square egy funkcionális interfész egyetlen számítási módszerrel (int x).
- A számítási módszer megvalósításához egy lambda kifejezést (int x) -> x * x használunk.
- A lambda x bemenetet vesz, és x * x-et ad vissza.
Java funkcionális interfészek a Java 8 előtt
A Java 8 előtt anonim belső osztályú objektumokat kellett létrehoznunk, vagy ezeket az interfészeket megvalósítani. Az alábbiakban egy példa látható arra, hogyan valósították meg a Runnable felületet a lambda-kifejezések bevezetése előtt.
Példa: Java program a funkcionális interfész bemutatására
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(); } }
Kimenet
New thread created
Beépített Java funkcionális interfészek
A Java SE 1.8-tól kezdve számos interfész létezik, amelyeket funkcionális interfészekké alakítanak át. Mindezek az interfészek @FunctionalInterface megjegyzésekkel vannak ellátva. Ezek az interfészek a következők:
- Futtatható: Ez a felület csak a fut() módszer.
- Hasonló: Ez a felület csak az Összehasonlítás() metódust tartalmazza.
- ActionListener: Ez a felület csak az actionPerformed() metódust tartalmazza.
- Hívható: Ez a felület csak a call() metódust tartalmazza.
A funkcionális interfészek típusai a Java nyelvben
A Java SE 8 négy fő funkcionális interfészt tartalmazott, amelyek az alábbiak szerint többféle helyzetben is alkalmazhatók:
- Fogyasztó
- Állítmány
- Funkció
- Szállító
1. Fogyasztó
A fogyasztói felület a funkcionális interfész az, amelyik csak egy argumentumot vagy egy dzsentrifikált argumentumot fogad el. A fogyasztói felületnek nincs visszatérési értéke. Semmit sem ad vissza. Vannak a Fogyasztó funkcionális változatai is DoubleConsumer IntConsumer és LongConsumer . Ezek a változatok primitív értékeket fogadnak el argumentumként.
Ezeken a változatokon kívül létezik még egy változata a fogyasztói interfésznek Bi-Consumer .
Szintaxis:
Fogyasztó
fogyasztó = (érték) -> System.out.println(érték);
A Java Consumer funkcionális interfész ezen megvalósítása kiírja a paraméterként átadott értéket a print utasításnak. Ez a megvalósítás a Java Lambda függvényét használja.
2. Predikátum
A Predikátum interfész egy argumentum logikai értékű függvényét képviseli. Általában adatfolyamok szűrésére használják. Csakúgy, mint a fogyasztói funkcionális interfész, a predikátum funkcionális interfésznek is van néhány kiterjesztése. Ezek azok IntPredicate DoublePredicate és LongPredicate . Az ilyen típusú predikátum funkcionális interfészek csak primitív adattípusokat vagy értékeket fogadnak el argumentumként.
Szintaxis:
css wrap szöveg
nyilvános felület Predikátum
{
logikai teszt(T t);
}
A Java predikátum funkcionális interfész Lambda kifejezésekkel is megvalósítható.
Állítmány
predikátum = (érték) -> érték != null;
3. Funkció
A funkció egy olyan funkcionális interfész a Java-ban, amely csak egyetlen argumentumot kap, és a szükséges feldolgozás után egy értéket ad vissza. A függvény interfészek számos változata instrumentális, és általában olyan primitív típusokban használatos, mint a double int long.
Szintaxis:
Funkció
függvény = (érték) -> érték * érték;
- Kétfunkciós: A Bi-Function lényegében egy funkcióhoz kapcsolódik. Ezenkívül két argumentumot igényel, míg a függvény egy argumentumot fogad el.
- Unáris operátor és bináris operátor: Két másik funkcionális interfész is van, amelyek neve Unary Operator és Bináris operátor. Mindkettő kiterjeszti a funkciót és a Bi-Functiont, ahol a bemeneti és a kimeneti típus megegyezik.
4. Szállító
A Szállító A funkcionális interfész egyfajta funkcionális interfész is, amely nem fogad semmilyen bemenetet vagy argumentumot, és mégis egyetlen kimenetet ad vissza. A beszállítói funkcionális interfész különböző kiterjesztései számos más beszállítói funkciót is ellátnak, mint pl BooleanSupplier DoubleSupplier LongSupplier és IntSupplier . Mindezen további specializációk visszatérési típusa csak a hozzájuk tartozó primitívek.
Szintaxis:
Szállító
beszállító = () -> 'Hello World!';
Példa: Predikátum interfész használata karakterláncok szűrésére
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); } } }
Kimenet
Geek GeeksQuiz Geek2
Funkcionális interfészek táblázat
Funkcionális interfészek | Leírás | Módszer |
|---|---|---|
Futható | Ez egy szál által végrehajtható feladatot jelent. | érvénytelen futás () |
Hasonló | Összehasonlít két tárgyat a megrendeléshez. | int összehasonlítás(T o) |
ActionListener burak ozcivit | Az eseményvezérelt programozásban akcióeseményt kezel. | érvénytelen actionPerformed (ActionEvent e) |
Hívható | Olyan feladatot jelöl, amely eredményt adhat vissza, vagy kivételt adhat. | A V call() kivételt dob |
Fogyasztó | Egyetlen bemeneti argumentumot fogad el, és nem ad vissza eredményt. | érvénytelen elfogadás (T t) |
Állítmány | Egyetlen argumentumot fogad el, és logikai eredményt ad vissza. | logikai teszt (T t) |
Funkció | Egyetlen érvet fogad el, és eredményt ad vissza. | R alkalmazni (T t) |
Szállító | Nem igényel érveket, hanem eredményt ad. | kap() |
BiConsumer | Két argumentumot fogad el, és nem ad vissza eredményt. | érvénytelen elfogadás (T t U u) |
BiPredicate | Két argumentumot fogad el, és logikai eredményt ad vissza. | logikai teszt (T t U u) lexikográfiai rend |
BiFunction | Két argumentumot fogad el, és egy eredményt ad vissza. | Jelentkezés (T t U u) |
UnaryOperator | Ez a függvény egy speciális esete, ahol a bemeneti és kimeneti típusok azonosak. | T alkalmazni (T t) |
Bináris Operátor | Ez a BiFunction egy speciális esete, ahol a bemeneti és kimeneti típusok azonosak. | T alkalmazni (T t1 T t2) |
Kapcsolódó cikkek
- Java 8
- Java Lambda kifejezések