Java navždy zostala objektovo orientovaným programovacím jazykom. Objektovo orientovaným programovacím jazykom môžeme vyhlásiť, že všetko, čo je prítomné v programovacom jazyku Java, rotuje v rámci objektov, okrem niektorých primitívnych dátových typov a primitívnych metód pre integritu a jednoduchosť. V programovacom jazyku zvanom Java nie sú prítomné iba funkcie. Funkcie v programovacom jazyku Java sú súčasťou triedy a ak ich chce niekto použiť, musí použiť triedu alebo objekt triedy na volanie akejkoľvek funkcie.
Funkčné rozhrania Java
A funkčné rozhranie je rozhranie, ktoré obsahuje iba jednu abstraktnú metódu. Môžu mať iba jednu funkciu na vystavenie. Od Java 8 vyššie, lambda výrazy možno použiť na reprezentáciu inštancie funkčného rozhrania. Funkčné rozhranie môže mať ľubovoľný počet predvolených metód. Spustiteľné , ActionListener , a Porovnateľné sú niektoré z príkladov funkčných rozhraní.
Funkčné rozhranie je navyše uznané ako Rozhrania jednej abstraktnej metódy . V skratke sú známe aj ako Rozhrania SAM . Funkčné rozhrania v jazyku Java sú novou funkciou, ktorá používateľom poskytuje prístup k základnému programovaniu.
Funkčné rozhrania sú súčasťou Java SE 8 s výrazmi Lambda a odkazmi na metódy, aby bol kód čitateľnejší, čistejší a priamočiarejší. Funkčné rozhrania sú rozhrania, ktoré zabezpečujú, že obsahujú presne len jednu abstraktnú metódu. Funkčné rozhrania sa používajú a vykonávajú reprezentáciou rozhrania pomocou an anotácia tzv @FunctionalInterface . Ako už bolo popísané vyššie, funkčné rozhrania môžu obsahovať iba jednu abstraktnú metódu. Môžu však obsahovať ľubovoľné množstvo predvolených a statických metód.
Vo funkčných rozhraniach nie je potrebné používať abstraktné kľúčové slovo, pretože je voliteľné použiť abstraktné kľúčové slovo, pretože štandardne je metóda definovaná v rozhraní iba abstraktná. Lambda výrazy môžeme nazvať aj ako inštanciu funkčného rozhrania.
Príklad funkčného rozhrania Java
Príklad 1:
Pred Java 8 sme museli vytvoriť anonymné objekty vnútornej triedy alebo implementovať tieto rozhrania.
Java
// Java program to demonstrate functional interface> class> Test {> > 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ýkon
New thread created>
Príklad 2:
Java 8 a novšie, môžeme priradiť lambda výraz na objekt funkčného rozhrania, ako je tento:
Java
// Java program to demonstrate Implementation of> // functional interface using lambda expressions> class> Test {> > public> static> void> main(String args[])> > {> > // lambda expression to create the object> > new> Thread(() ->{> > System.out.println(> 'New thread created'> );> > }).start();> > }> }> |
>
>Výkon
New thread created>
@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é.
Nižšie je uvedená implementácia vyššie uvedenej témy:
Java
// Java program to demonstrate lambda expressions to> // implement a user defined functional interface.> @FunctionalInterface> interface> Square {> > int> calculate(> int> x);> }> class> Test {> > 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ýkon
25>
Niektoré vstavané 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é –
- Runnable –> Toto rozhranie obsahuje iba metódu run(). Porovnateľné –> Toto rozhranie obsahuje iba metódu CompareTo(). ActionListener –> Toto rozhranie obsahuje iba metódu actionPerformed(). Callable –> Toto rozhranie obsahuje iba metódu call().
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:
- Dodávateľ spotrebiteľskej predikátovej funkcie
Medzi predchádzajúcimi štyrmi rozhraniami majú prvé tri rozhrania, t. j. spotrebiteľ, predikát a funkcia, tiež doplnky, ktoré sú uvedené pod –
pole reťazcov c
- Spotrebiteľ -> Obojstranný spotrebiteľ
- Predikát -> Dvojpredikát
- Funkcia -> Bi-Function, Unárny operátor, Binárny operátor
1. Spotrebiteľ
Spotrebiteľské rozhranie funkčného rozhrania je také, 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 Bi-Consumer.
Bi-spotrebiteľ - Bi-Consumer je najzaujímavejším variantom spotrebiteľského rozhrania. Spotrebiteľské rozhranie používa iba jeden argument, ale na druhej strane rozhranie Bi-Consumer používa dva argumenty. Spotrebiteľ aj dvojspotrebiteľ nemajú žiadnu návratnú hodnotu. Nevracia nič rovnako ako spotrebiteľské rozhranie. Používa sa pri iterácii cez položky mapy.
Syntax / Prototyp spotrebiteľského funkčného rozhrania –
Consumer consumer = (value) ->System.out.println(value);>
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
Vo vedeckej logike je funkcia, ktorá akceptuje argument a na oplátku generuje boolovskú hodnotu ako odpoveď, známa ako predikát. Podobne v programovacom jazyku Java je predikátové funkčné rozhranie Java typom funkcie, ktorá akceptuje jedinú hodnotu alebo argument a vykoná na ňom nejaký druh spracovania a vráti boolovskú (pravda/nepravda) odpoveď. Implementácia funkčného rozhrania Predikát zahŕňa aj logiku filtrovania (proces, ktorý sa používa na filtrovanie komponentov prúdu na základe poskytnutého predikátu) v jazyku Java.
Rovnako ako funkčné rozhranie spotrebiteľa, funkčné rozhranie Preddicate má tiež niektoré rozšírenia. Sú to IntPredicate, DoublePredicate a LongPredicate. Tieto typy predikátových funkčných rozhraní akceptujú ako argumenty iba primitívne dátové typy alebo hodnoty.
Dvojpredikát – Bi-Predicate je tiež rozšírením funkčného rozhrania Preddicate, ktoré namiesto jedného berie dva argumenty, vykoná nejaké spracovanie a vráti boolovskú hodnotu.
Syntax predikátového funkčného rozhrania –
public interface Predicate { boolean test(T t); }>
Predikátové funkčné rozhranie možno implementovať aj pomocou triedy. Syntax na implementáciu predikátového funkčného rozhrania pomocou triedy je uvedená nižšie –
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>
Funkčné rozhranie predikátu Java možno implementovať aj pomocou výrazov Lambda. Príklad implementácie funkčného rozhrania Preddicate je uvedený nižšie –
Predicate predicate = (value) ->hodnota != null;>
Táto implementácia funkčných rozhraní v jazyku Java pomocou výrazov Java Lambda je spravovateľnejšia a efektívnejšia ako implementácia pomocou triedy, pretože obe implementácie vykonávajú rovnakú prácu, t. j. vracajú rovnaký výstup.
3. Funkcia
Funkcia je typ funkčného rozhrania v jazyku Java, ktoré prijíma iba jeden argument a po požadovanom spracovaní vráti hodnotu. Existuje veľa verzií funkčných rozhraní, pretože primitívny typ nemôže zahŕňať argument všeobecného typu, takže potrebujeme tieto verzie funkčných rozhraní. Mnoho rôznych verzií funkčných rozhraní je inštrumentálnych a bežne sa používajú v primitívnych typoch ako double, int, long. V argumente sa používajú aj rôzne postupnosti týchto primitívnych typov.
Tieto verzie sú:
Bi-Funkcia
Bifunkcia v podstate súvisí s funkciou. Okrem toho potrebuje dva argumenty, zatiaľ čo Funkcia akceptuje jeden argument.
Prototyp a syntax Bi-Function sú uvedené nižšie –
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>
Vo vyššie uvedenom kóde rozhrania sú T a U vstupy a existuje iba jeden výstup, ktorý je R.
Unárny operátor a binárny operátor
Existujú aj dve ďalšie funkčné rozhrania, ktoré sa nazývajú Unary Operator a Binary Operator. Obidve rozširujú funkciu a bi-funkciu. Jednoducho povedané, unárny operátor rozširuje funkciu a binárny operátor rozširuje bi-funkciu.
Prototyp unárneho operátora a binárneho operátora je uvedený nižšie:
i. Unárny operátor
@FunctionalInterface public interface UnaryOperator extends Function { ……... }>
ii . Binárny operátor
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>
Vo vyššie uvedenom príklade môžeme pochopiť, že unárny operátor akceptuje iba jeden argument a vráti iba jeden argument. Napriek tomu v unárnom operátore musia byť vstupné aj výstupné hodnoty rovnaké a rovnakého typu.
Na druhej strane binárny operátor berie dve hodnoty a vracia jednu hodnotu porovnateľnú s bifunkciou, ale podobnú unárnemu operátoru, vstupné a výstupné typy hodnôt musia byť identické a rovnakého typu.
4. Dodávateľ
Funkčné rozhranie dodávateľa je tiež typom funkčného rozhrania, ktoré neprijíma žiadny vstup ani argument a napriek tomu vracia jediný výstup. Tento typ funkčného rozhrania sa všeobecne používa pri lenivom generovaní hodnôt. Dodávateľské funkčné rozhrania sa tiež používajú na definovanie logiky generovania ľubovoľnej sekvencie. Napríklad – Logiku Fibonacciho série je možné vygenerovať pomocou streamu. generovať metódu, ktorá je implementovaná funkčným rozhraním Dodávateľa.
Rôzne rozšírenia funkčného rozhrania dodávateľa obsahujú mnoho ďalších funkcií dodávateľov, ako sú 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 / Prototyp funkčného rozhrania dodávateľa je –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>
Nižšie je uvedená implementácia vyššie uvedenej témy:
Java
// A simple program to demonstrate the use> // of predicate interface> import> java.util.*;> import> java.util.function.Predicate;> class> Test {> > public> static> void> main(String args[])> > {> > // create a list of strings> > List names = Arrays.asList(> > 'Geek'> ,> 'GeeksQuiz'> ,> 'g1'> ,> 'QA'> ,> 'Geek2'> );> > // declare the predicate type as string and use> > // lambda expression to create object> > Predicate p = (s) ->s.startsWith(> 'G'> );> > // Iterate through the list> > for> (String st : names) {> > // call the test method> > if> (p.test(st))> > System.out.println(st);> > }> > }> }> |
>
>Výkon
Geek GeeksQuiz Geek2>
Dôležité body/pozorovania ns:
Tu je niekoľko dôležitých bodov týkajúcich sa funkčných rozhraní v jazyku Java:
- Vo funkčných rozhraniach je podporovaná iba jedna abstraktná metóda. Ak anotácia funkčného rozhrania, t. j. @FunctionalInterface nie je implementovaná alebo napísaná s funkčným rozhraním, možno v ňom deklarovať viac ako jednu abstraktnú metódu. Avšak v tejto situácii s viac ako jednou funkciou sa toto rozhranie nebude nazývať funkčným rozhraním. Nazýva sa to nefunkčné rozhranie.
- Anotácia @FunctionalInterface nie je potrebná, pretože je len dobrovoľná. Toto je napísané, pretože pomáha pri kontrole úrovne kompilátora. Okrem toho je to voliteľné.
- Do funkčného rozhrania je možné pridať nekonečné množstvo metód (či už statických alebo predvolených). Jednoducho povedané, funkčné rozhranie obsahujúce statické a predvolené metódy nemá žiadne obmedzenia.
- Prepisovanie metód z nadradenej triedy neporušuje pravidlá funkčného rozhrania v jazyku Java.
- The funkcia java.util balík obsahuje veľa vstavaných funkčných rozhraní v jazyku Java 8.