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
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
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
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
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:
- Spotrebiteľ
- Predikát
- Funkcia
- 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!'; čo je príkaz export v linuxe
Príklad: Použitie rozhrania predikátu na filtrovanie reťazcov
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
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