logo

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ľadodávateľ = () -> 'Ahoj svet!';

čo je príkaz export v linuxe

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