logo

Java funkcionális interfészek

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

Java
public 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

Java
class 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:

  1. Fogyasztó
  2. Állítmány
  3. Funkció 
  4. 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

Java
import 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