Funkční rozhraní Java

Funkční rozhraní v Javě je rozhraní, které obsahuje pouze jednu abstraktní metodu. Funkční rozhraní mohou mít více výchozích nebo statických metod, ale pouze jednu abstraktní metodu.

Od Java 8 dále mohou být lambda výrazy a odkazy na metody použity k reprezentaci instance funkčního rozhraní.

Příklad: Použití funkčního rozhraní s výrazem 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  

Vysvětlení:

  • Výše uvedený program demonstruje použití výrazu lambda s funkčním rozhraním Runnable.
  • Runnable má jednu abstraktní metodu run(), takže se kvalifikuje jako funkční rozhraní.
  • Lambda ()-> System.out.println('Vytvořeno nové vlákno') definuje metodu run().
  • new Thread().start() spustí nové vlákno, které spustí tělo lambda

Poznámka:

A F funkční rozhraní může také rozšířit další funkční rozhraní.

@FunctionalInterface Anotace

Anotace @FunctionalInterface se používá k zajištění toho, že funkční rozhraní nemůže mít více než jednu abstraktní metodu. V případě, že je přítomno více než jedna abstraktní metoda, kompilátor označí zprávu 'Neočekávaná anotace @FunctionalInterface'. Použití této anotace však není povinné.

Poznámka:

Anotace @FunctionalInterface je volitelná, ale je dobré ji používat. Pomáhá zachytit chybu v rané fázi tím, že zajistí, že rozhraní má pouze jednu abstraktní metodu.

Příklad: Definování funkčního rozhraní pomocí anotace @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  

Vysvětlení :

  • Čtverec je funkční rozhraní s jedinou metodou vypočítat (int x).
  • K implementaci metody výpočtu se používá výraz lambda (int x) -> x * x.
  • Lambda vezme x jako vstup a vrátí x * x.

Funkční rozhraní Java před Java 8

Před Java 8 jsme museli vytvořit anonymní objekty vnitřní třídy nebo implementovat tato rozhraní. Níže je uveden příklad, jak bylo rozhraní Runnable implementováno před zavedením výrazů lambda.

Příklad: Java program pro demonstraci funkčního rozhraní

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  

Vestavěné funkční rozhraní Java

Od Java SE 1.8 a novější existuje mnoho rozhraní, která jsou převedena na funkční rozhraní. Všechna tato rozhraní jsou označena @FunctionalInterface. Tato rozhraní jsou následující:

  • Spustitelné: Toto rozhraní obsahuje pouze běh() metoda.
  • Srovnatelný: Toto rozhraní obsahuje pouze metodu CompareTo().
  • ActionListener: Toto rozhraní obsahuje pouze metodu actionPerformed().
  • Volatelná: Toto rozhraní obsahuje pouze metodu call().

Typy funkčních rozhraní v Javě

Java SE 8 obsahovala čtyři hlavní druhy funkčních rozhraní, která lze použít v různých situacích, jak je uvedeno níže:

  1. Spotřebitel
  2. Predikát
  3. Funkce 
  4. Dodavatel

1. Spotřebitel 

The spotřebitelské rozhraní funkčního rozhraní je rozhraní, které přijímá pouze jeden argument nebo gentrifikovaný argument. Spotřebitelské rozhraní nemá žádnou návratovou hodnotu. Nevrací nic. Existují i ​​funkční varianty Spotřebitele DoubleConsumer IntConsumer a LongConsumer . Tyto varianty přijímají primitivní hodnoty jako argumenty. 

Kromě těchto variant existuje ještě jedna varianta spotřebitelského rozhraní známá jako Bi-Consumer

Syntax:

Spotřebitel spotřebitel = (hodnota) -> System.out.println(hodnota);

Tato implementace funkčního rozhraní Java Consumer vytiskne hodnotu předávanou jako parametr tiskovému příkazu. Tato implementace využívá funkci Lambda Java.

2. Predikát 

The Predikátové rozhraní představuje funkci jednoho argumentu s logickou hodnotou. Běžně se používá pro operace filtrování v tocích. Stejně jako spotřebitelské funkční rozhraní má funkční rozhraní predikátu také některá rozšíření. Toto jsou IntPredicate DoublePredicate a LongPredicate . Tyto typy predikátových funkčních rozhraní přijímají jako argumenty pouze primitivní datové typy nebo hodnoty.  

Syntax: 

veřejné rozhraní Predikát {
   booleovský test (T t);
}

Funkční rozhraní predikátu Java lze také implementovat pomocí výrazů Lambda.

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

3. Funkce

A funkce je typ funkčního rozhraní v Javě, které přijímá pouze jeden argument a po požadovaném zpracování vrací hodnotu. Mnoho různých verzí funkčních rozhraní je instrumentálních a běžně se používají v primitivních typech, jako je double int long.

Syntax:

Funkce funkce = (hodnota) -> hodnota * hodnota;

  • Bi-funkce: The Bi-funkce podstatně souvisí s funkcí. Kromě toho vyžaduje dva argumenty, zatímco Funkce přijímá jeden argument. 
  • Unární operátor a binární operátor: Existují také dvě další funkční rozhraní, která jsou pojmenována jako Unární operátor a Binární operátor. Oba rozšiřují funkci a bi-funkci, kde je typ vstupu i typ výstupu stejný.

4. Dodavatel

The Dodavatel funkční rozhraní je také typem funkčního rozhraní, které nebere žádný vstup ani argument a přesto vrací jediný výstup. Různá rozšíření funkčního rozhraní dodavatele obsahují mnoho dalších funkcí dodavatelů, jako je např BooleanSupplier DoubleSupplier LongSupplier a IntSupplier . Návratovým typem všech těchto dalších specializací jsou pouze jejich odpovídající primitiva. 

Syntax:

Dodavatel dodavatel = () -> 'Ahoj světe!';

Příklad: Použití rozhraní predikátu k řetězcům filtrů

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  

Tabulka funkčních rozhraní

Funkční rozhraní

Popis

Metoda

Spustitelný

Představuje úlohu, kterou může vlákno provést.

void run()

Srovnatelný

Porovnává dva objekty pro objednání.

int srovnáníTo(T o)

ActionListener

Zpracovává akční událost v programování řízeném událostmi.

void actionPerformed(ActionEvent e)

Volatelné

Představuje úlohu, která může vrátit výsledek nebo vyvolat výjimku.

V call() vyvolá výjimku

Spotřebitel

Přijímá jeden vstupní argument a nevrací žádný výsledek.

void přijmout (T t)

Predikát

Přijme jeden argument a vrátí booleovský výsledek.

booleovský test (T t)

Funkce

Přijme jediný argument a vrátí výsledek.

R použít (T t)

Dodavatel

Nepotřebuje žádné argumenty, ale poskytuje výsledek.

T get()

BiConsumer

Přijímá dva argumenty a nevrací žádný výsledek.

void přijmout (T t U u)

BiPredicate

Přijímá dva argumenty a vrací booleovský výsledek.

booleovský test (T t U u)

BiFunction

Přijme dva argumenty a vrátí výsledek.

R použít (T t U u)

UnaryOperator

Toto je speciální případ funkce, kde jsou vstupní a výstupní typy stejné.

T použít (T t)

Binární operátor

Toto je speciální případ BiFunction, kde jsou typy vstupu a výstupu stejné.

T použít (T t1 T t2)

Související články

  • Java 8
  • Java Lambda výrazy