Funkčné rozhrania Java

Funkčné rozhranie v jazyku Java je rozhranie, ktoré obsahuje iba jednu abstraktnú metódu. Funkčné rozhrania môžu mať viacero predvolených alebo statických metód, ale iba jednu abstraktnú metódu.

Od verzie Java 8 a novších môžu byť výrazy lambda a odkazy na metódy použité na reprezentáciu inštancie funkčného rozhrania.

Príklad: Použitie funkčného rozhrania s výrazom Lambda

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

Výstup
New thread created  

Vysvetlenie:

  • Vyššie uvedený program demonštruje použitie výrazu lambda s funkčným rozhraním Runnable.
  • Runnable má jednu abstraktnú metódu run(), takže sa kvalifikuje ako funkčné rozhranie.
  • Lambda ()-> System.out.println('Vytvorené nové vlákno') definuje metódu run().
  • new Thread().start() spustí nové vlákno, ktoré vykoná telo lambda

Poznámka:

A f funkčné rozhranie môže tiež rozšíriť ďalšie funkčné rozhranie.

@FunctionalInterface Anotácia

Anotácia @FunctionalInterface sa používa na zabezpečenie toho, že funkčné rozhranie nemôže mať viac ako jednu abstraktnú metódu. V prípade, že je prítomných viac ako jedna abstraktná metóda, kompilátor označí správu „Neočakávaná anotácia @FunctionalInterface“. Použitie tejto anotácie však nie je povinné.

Poznámka:

Anotácia @FunctionalInterface je voliteľná, ale je vhodné ju použiť. Pomáha zachytiť chybu v počiatočnom štádiu tým, že sa uistí, že rozhranie má iba jednu abstraktnú metódu.

Príklad: Definovanie funkčného rozhrania pomocou anotácie @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  );      }   }   

Výstup
25  

Vysvetlenie :

  • Square je funkčné rozhranie s jedinou metódou výpočtu (int x).
  • Na implementáciu metódy výpočtu sa používa výraz lambda (int x) -> x * x.
  • Lambda vezme x ako vstup a vráti x * x.

Funkčné rozhrania Java pred Java 8

Pred Java 8 sme museli vytvoriť anonymné objekty vnútornej triedy alebo implementovať tieto rozhrania. Nižšie je uvedený príklad toho, ako bolo rozhranie Runnable implementované pred zavedením výrazov lambda.

Príklad: Java program na demonštráciu funkčného rozhrania

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

Výstup
New thread created  

Zabudované funkčné rozhrania Java

Od Java SE 1.8 a novších existuje veľa rozhraní, ktoré sú prevedené na funkčné rozhrania. Všetky tieto rozhrania sú označené @FunctionalInterface. Tieto rozhrania sú nasledovné:

  • Spustiteľné: Toto rozhranie obsahuje iba spustiť() metóda.
  • Porovnateľné: Toto rozhranie obsahuje iba metódu CompareTo().
  • ActionListener: Toto rozhranie obsahuje iba metódu actionPerformed().
  • Volateľné: Toto rozhranie obsahuje iba metódu call().

Typy funkčných rozhraní v Jave

Java SE 8 obsahovala štyri hlavné druhy funkčných rozhraní, ktoré možno použiť vo viacerých situáciách, ako je uvedené nižšie:

  1. Spotrebiteľ
  2. Predikát
  3. Funkcia 
  4. dodávateľa

1. Spotrebiteľ 

The spotrebiteľské rozhranie funkčného rozhrania je to, ktoré akceptuje iba jeden argument alebo gentrifikovaný argument. Spotrebiteľské rozhranie nemá žiadnu návratovú hodnotu. Nevracia nič. Existujú aj funkčné varianty Spotrebiteľa DoubleConsumer IntConsumer a LongConsumer . Tieto varianty akceptujú primitívne hodnoty ako argumenty. 

Okrem týchto variantov existuje ešte jeden variant spotrebiteľského rozhrania známy ako Dvojspotrebiteľ

Syntax:

Spotrebiteľ spotrebiteľ = (hodnota) -> System.out.println(hodnota);

Táto implementácia funkčného rozhrania Java Consumer vytlačí hodnotu odovzdanú ako parameter do tlačového príkazu. Táto implementácia využíva funkciu Lambda jazyka Java.

2. Predikát 

The Predikátové rozhranie predstavuje boolovskú funkciu jedného argumentu. Bežne sa používa na operácie filtrovania v prúdoch. Rovnako ako spotrebiteľské funkčné rozhranie, aj funkčné rozhranie predikátu má niektoré rozšírenia. Toto sú IntPredicate DoublePredicate a LongPredicate . Tieto typy predikátových funkčných rozhraní akceptujú ako argumenty iba primitívne dátové typy alebo hodnoty.  

Syntax: 

verejné rozhranie Predikát {
   booleovský test (T t);
}

Funkčné rozhranie predikátu Java možno implementovať aj pomocou výrazov Lambda.

Predikát predikát = (hodnota) -> hodnota != null;

3. Funkcia

A funkciu je typ funkčného rozhrania v jazyku Java, ktoré prijíma iba jeden argument a po požadovanom spracovaní vráti hodnotu. Mnoho rôznych verzií funkčných rozhraní je inštrumentálnych a bežne sa používajú v primitívnych typoch, ako je double int long.

Syntax:

Funkcia funkcia = (hodnota) -> hodnota * hodnota;

  • Bifunkcia: The Bi-Funkcia podstatne súvisí s funkciou. Okrem toho sú potrebné dva argumenty, zatiaľ čo funkcia prijíma jeden argument. 
  • Unárny operátor a binárny operátor: Existujú aj dve ďalšie funkčné rozhrania, ktoré sú pomenované ako Unárny operátor a Binárny operátor. Obidve rozširujú funkciu a bi-funkciu, kde typ vstupu aj typ výstupu sú rovnaké.

4. Dodávateľ

The dodávateľa funkčné rozhranie je tiež typ funkčného rozhrania, ktoré neprijíma žiadny vstup ani argument a napriek tomu vracia jediný výstup. Rôzne rozšírenia funkčného rozhrania dodávateľa obsahujú mnoho ďalších funkcií dodávateľov, napr BooleanSupplier DoubleSupplier LongSupplier a IntSupplier . Návratovým typom všetkých týchto ďalších špecializácií sú iba ich zodpovedajúce primitívy. 

Syntax:

dodávateľa dodávateľ = () -> 'Ahoj svet!';

Príklad: Použitie rozhrania predikátu na filtrovanie reťazcov

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

Výstup
Geek GeeksQuiz Geek2  

Tabuľka funkčných rozhraní

Funkčné rozhrania

Popis

Metóda

Spustiteľné

Predstavuje úlohu, ktorú môže vlákno vykonať.

void run()

Porovnateľné

Porovnáva dva objekty na objednanie.

int porovnanieTo(T o)

ActionListener

Spracováva akčnú udalosť v programovaní riadenom udalosťou.

void actionPerformed(ActionEvent e)

Volateľné

Predstavuje úlohu, ktorá môže vrátiť výsledok alebo vyvolať výnimku.

V call() vyvolá výnimku

Spotrebiteľ

Prijíma jeden vstupný argument a nevracia žiadny výsledok.

neplatné prijať (T t)

Predikát

Prijme jeden argument a vráti boolovský výsledok.

booleovský test (T t)

Funkcia

Prijme jeden argument a vráti výsledok.

R použiť (T t)

dodávateľa

Nepotrebuje žiadne argumenty, ale poskytuje výsledok.

T get()

BiConsumer

Prijíma dva argumenty a nevracia žiadny výsledok.

void prijať (T t U u)

BiPredicate

Prijíma dva argumenty a vracia boolovský výsledok.

booleovský test (T t U u)

BiFunction

Prijme dva argumenty a vráti výsledok.

R použiť(T t U u)

UnaryOperator

Toto je špeciálny prípad funkcie, kde sú typy vstupu a výstupu rovnaké.

T použiť (T t)

BinaryOperator

Toto je špeciálny prípad BiFunction, kde sú typy vstupu a výstupu rovnaké.

Použiť (T t1 T t2)

Súvisiace články

  • Java 8
  • Java Lambda výrazy