Java funkcionalna sučelja

Funkcionalno sučelje u Javi je sučelje koje sadrži samo jednu apstraktnu metodu. Funkcionalna sučelja mogu imati više zadanih ili statičkih metoda, ali samo jednu apstraktnu metodu.

Od Jave 8 pa nadalje lambda izrazi i reference metoda mogu se koristiti za predstavljanje instance funkcionalnog sučelja.

Primjer: Korištenje funkcionalnog sučelja s 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  ();      }   }   

Izlaz
New thread created  

Obrazloženje:

  • Gornji program demonstrira korištenje lambda izraza s funkcionalnim sučeljem Runnable.
  • Runnable ima jednu apstraktnu metodu run() pa se kvalificira kao funkcionalno sučelje.
  • Lambda ()-> System.out.println('Stvorena je nova nit') definira metodu run().
  • new Thread().start() pokreće novu nit koja izvršava lambda tijelo

Bilješka:

A f nefunkcionalno sučelje također može proširiti drugo funkcionalno sučelje.

@Funkcionalno sučelje Anotacija

Napomena @FunctionalInterface koristi se kako bi se osiguralo da funkcionalno sučelje ne može imati više od jedne apstraktne metode. U slučaju da je prisutno više od jedne apstraktne metode, prevodilac označava poruku 'Neočekivana napomena @FunctionalInterface'. Međutim, korištenje ove napomene nije obavezno.

Bilješka:

Bilješka @FunctionalInterface nije obavezna, ali je dobra praksa za korištenje. Pomaže u otkrivanju pogreške u ranoj fazi osiguravajući da sučelje ima samo jednu apstraktnu metodu.

Primjer: Definiranje funkcionalnog sučelja s napomenom @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  );      }   }   

Izlaz
25  

Obrazloženje :

  • Square je funkcionalno sučelje s jednom metodom izračuna (int x).
  • Lambda izraz (int x) -> x * x koristi se za implementaciju metode izračuna.
  • Lambda uzima x kao ulaz i vraća x * x.

Java funkcionalna sučelja prije Jave 8

Prije Jave 8 morali smo stvarati anonimne unutarnje objekte klase ili implementirati ova sučelja. Ispod je primjer kako je Runnable sučelje implementirano prije uvođenja lambda izraza.

Primjer: Java program za demonstraciju funkcionalnog sučelja

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

Izlaz
New thread created  

Ugrađena Java funkcionalna sučelja

Od Java SE 1.8 nadalje postoji mnogo sučelja koja se pretvaraju u funkcionalna sučelja. Sva ova sučelja označena su s @FunctionalInterface. Ova sučelja su sljedeća:

  • Pokretljivo: Ovo sučelje sadrži samo trčanje() metoda.
  • Usporedivo: Ovo sučelje sadrži samo metodu compareTo().
  • ActionListener: Ovo sučelje sadrži samo metodu actionPerformed().
  • Poziv: Ovo sučelje sadrži samo metodu call().

Vrste funkcionalnih sučelja u Javi

Java SE 8 uključuje četiri glavne vrste funkcionalnih sučelja koja se mogu primijeniti u više situacija kao što je navedeno u nastavku:

  1. Potrošač
  2. Predikat
  3. Funkcija 
  4. Dobavljač

1. Potrošač 

The potrošačko sučelje funkcionalnog sučelja je onaj koji prihvaća samo jedan argument ili gentrificirani argument. Potrošačko sučelje nema povratnu vrijednost. Ništa ne vraća. Postoje i funkcionalne varijante Potrošača Dvostruki potrošač IntConsumer i LongConsumer . Ove varijante prihvaćaju primitivne vrijednosti kao argumente. 

Osim ovih varijanti postoji još jedna varijanta potrošačkog sučelja poznata kao Dvostruki potrošač

Sintaksa:

Potrošač potrošač = (vrijednost) -> System.out.println(vrijednost);

Ova implementacija funkcionalnog sučelja Java Consumer ispisuje vrijednost proslijeđenu kao parametar naredbi za ispis. Ova implementacija koristi Lambda funkciju Jave.

2. Predikat 

The Predikatno sučelje predstavlja funkciju s booleovom vrijednošću jednog argumenta. Obično se koristi za operacije filtriranja u tokovima. Baš kao i potrošačko funkcionalno sučelje, predikatno funkcionalno sučelje također ima neka proširenja. Ovo su IntPredicate Dvostruki predikat i Dugi predikat . Ove vrste predikatnih funkcionalnih sučelja prihvaćaju samo primitivne tipove podataka ili vrijednosti kao argumente.  

Sintaksa: 

javno sučelje Predikat {
   Booleov test(T t);
}

Funkcionalno sučelje Java predikata također se može implementirati pomoću Lambda izraza.

Predikat predikat = (vrijednost) -> vrijednost != null;

3. Funkcija

A funkcija je vrsta funkcionalnog sučelja u Javi koja prima samo jedan argument i vraća vrijednost nakon potrebne obrade. Mnoge različite verzije funkcijskih sučelja su instrumentalne i obično se koriste u primitivnim tipovima kao što je double int long.

Sintaksa:

Funkcija funkcija = (vrijednost) -> vrijednost * vrijednost;

  • Bi-funkcija: The Dvostruka funkcija bitno je povezan s funkcijom. Osim toga, uzima dva argumenta, dok funkcija prihvaća jedan argument. 
  • Unarni operator i binarni operator: Postoje i druga dva funkcionalna sučelja koja su nazvana kao Unarni operator i Binarni operator. Oboje proširuju Funkciju i Bi-Funkciju gdje su i vrsta ulaza i vrsta izlaza iste.

4. Dobavljač

The Dobavljač funkcionalno sučelje također je vrsta funkcionalnog sučelja koje ne prima nikakav ulaz ili argument, a vraća samo jedan izlaz. Različita proširenja funkcionalnog sučelja dobavljača sadrže mnoge druge funkcije dobavljača kao što su BooleanSupplier DoubleSupplier LongSupplier i IntSupplier . Povratni tip svih ovih daljnjih specijalizacija samo su njihove odgovarajuće primitive. 

Sintaksa:

Dobavljač dobavljač = () -> 'Hello World!';

Primjer: Korištenje predikatnog sučelja za filtriranje nizova

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

Izlaz
Geek GeeksQuiz Geek2  

Tablica funkcionalnih sučelja

Funkcionalna sučelja

Opis

metoda

Pokretljiv

Predstavlja zadatak koji može izvršiti nit.

void run()

Usporedivo

Uspoređuje dva objekta za naručivanje.

int compareTo(T o)

ActionListener

Obrađuje akcijski događaj u programiranju vođenom događajima.

void actionPerformed(ActionEvent e)

Poziv

Predstavlja zadatak koji može vratiti rezultat ili izbaciti iznimku.

V call() izbacuje iznimku

Potrošač

Prihvaća jedan ulazni argument i ne vraća nikakav rezultat.

nevažeći prihvatiti (T t)

Predikat

Prihvaća jedan argument i vraća Booleov rezultat.

Booleov test (T t)

Funkcija

Prihvaća jedan argument i vraća rezultat.

R primijeniti (T t)

Dobavljač

Ne uzima nikakve argumente, već daje rezultat.

T get()

BiPotrošač

Prihvaća dva argumenta i ne vraća nikakav rezultat.

nevažeći prihvatiti (T t U u)

Bipredikat

Prihvaća dva argumenta i vraća Booleov rezultat.

Booleov test (T t U u)

Bifunkcija

Prihvaća dva argumenta i vraća rezultat.

R primijeniti (T t U u)

Unarni operator

Ovo je poseban slučaj funkcije gdje su tipovi ulaza i izlaza isti.

T primijeniti (T t)

BinarniOperator

Ovo je poseban slučaj BiFunctiona gdje su tipovi ulaza i izlaza isti.

T primijeniti (T t1 T t2)

Povezani članci

  • Java 8
  • Java Lambda izrazi