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
Javapublic 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í
Javaclass 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:
- Spotřebitel
- Predikát
- Funkce
- 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:
Dodavatel
dodavatel = () -> 'Ahoj světe!';
Příklad: Použití rozhraní predikátu k řetězcům filtrů
Javaimport 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