logo

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í:

jaká je velikost mého monitoru
  • 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.

jak vrátit pole v Javě

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:

Dodavateldodavatel = () -> '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)

zablokovaná čísla

Funkce

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

R použít (T t)

Dodavatel

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

přepínač strojopisu

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