Funkcionalni vmesniki Java

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

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

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

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

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:

  1. Potrošnik
  2. Predikat
  3. funkcija 
  4. 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č;

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

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

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

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.

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.

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