Java navždy zůstala objektově orientovaným programovacím jazykem. Objektově orientovaným programovacím jazykem můžeme prohlásit, že vše, co je přítomno v programovacím jazyce Java, rotuje v rámci objektů, kromě některých primitivních datových typů a primitivních metod pro integritu a jednoduchost. V programovacím jazyce zvaném Java nejsou k dispozici pouze funkce. Funkce v programovacím jazyce Java jsou součástí třídy, a pokud je někdo chce používat, musí k volání jakékoli funkce použít třídu nebo objekt třídy.
Funkční rozhraní Java
A funkční rozhraní je rozhraní, které obsahuje pouze jednu abstraktní metodu. Mohou mít pouze jednu funkci k zobrazení. Od Java 8 výše, lambda výrazy lze použít k reprezentaci instance funkčního rozhraní. Funkční rozhraní může mít libovolný počet výchozích metod. Spustitelný , ActionListener , a Srovnatelný jsou některé z příkladů funkčních rozhraní.
Funkční rozhraní je navíc rozpoznáno jako Rozhraní jediné abstraktní metody . Stručně řečeno, jsou také známé jako SAM rozhraní . Funkční rozhraní v Javě jsou novou funkcí, která uživatelům poskytuje přístup k základnímu programování.
V Java SE 8 jsou zahrnuta funkční rozhraní s výrazy Lambda a odkazy na metody, aby byl kód čitelnější, čistší a přímočarý. Funkční rozhraní jsou rozhraní, která zajišťují, že obsahují pouze jednu abstraktní metodu. Funkční rozhraní se používají a spouštějí reprezentací rozhraní pomocí an anotace tzv @FunctionalInterface . Jak bylo popsáno dříve, funkční rozhraní mohou obsahovat pouze jednu abstraktní metodu. Mohou však zahrnovat libovolné množství výchozích a statických metod.
Ve funkčních rozhraních není nutné používat klíčové slovo abstract, protože použití klíčového slova abstract je volitelné, protože ve výchozím nastavení je metoda definovaná uvnitř rozhraní pouze abstraktní. Lambda výrazy můžeme také nazvat jako instanci funkčního rozhraní.
Příklad funkčního rozhraní Java
Příklad 1:
velikost latexového písma
Před Java 8 jsme museli vytvořit anonymní objekty vnitřní třídy nebo implementovat tato rozhraní.
Jáva
// 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ýstup
New thread created>
Příklad 2:
Java 8 a novější, můžeme přiřadit lambda výraz do jeho funkčního objektu rozhraní, jako je tento:
Jáva
// 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();> > }> }> |
singleton design
>
>Výstup
New thread created>
@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é.
Níže je implementace výše uvedeného tématu:
Jáva
// 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ýstup
25>
Některá 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í –
- Runnable –> Toto rozhraní obsahuje pouze metodu run(). Comparable –> Toto rozhraní obsahuje pouze metodu CompareTo(). ActionListener –> Toto rozhraní obsahuje pouze metodu actionPerformed(). Callable –> Toto rozhraní obsahuje pouze metodu call().
Java SE 8 obsahovala čtyři hlavní druhy funkčních rozhraní které lze použít ve více situacích, jak je uvedeno níže:
- Dodavatel spotřebitelských predikátových funkcí
Mezi předchozími čtyřmi rozhraními mají první tři rozhraní, tj. spotřebitel, predikát a funkce, rovněž doplňky, které jsou uvedeny pod –
převod z řetězce na int v jazyce Java
- Consumer -> Bi-Consumer
- Predikát -> Bi-predikát
- Funkce -> Bi-Function, Unární operátor, Binární operátor
1. Spotřebitel
Spotřebitelské rozhraní funkčního rozhraní je takové, které přijímá pouze jeden argument nebo gentrifikovaný argument. Spotřebitelské rozhraní nemá žádnou návratovou hodnotu. Nevrací nic. Existují také 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.
Bispotřebitelé – Bi-Consumer je nejvíce vzrušující varianta spotřebitelského rozhraní. Spotřebitelské rozhraní přijímá pouze jeden argument, ale na druhé straně rozhraní Bi-Consumer přijímá dva argumenty. Spotřebitel i dvouspotřebitel nemají žádnou návratovou hodnotu. Také nevrací nic, stejně jako spotřebitelské rozhraní. Používá se při iteraci přes položky mapy.
Syntaxe / Prototyp spotřebitelského funkčního rozhraní –
java zřetězení řetězců
Consumer consumer = (value) ->System.out.println(value);>
Tato implementace funkčního rozhraní Java Consumer vytiskne hodnotu předávanou jako parametr příkazu tisku. Tato implementace využívá funkci Lambda Java.
2. Predikát
Ve vědecké logice je funkce, která přijímá argument a na oplátku generuje booleovskou hodnotu jako odpověď, známá jako predikát. Podobně v programovacím jazyce Java je predikátové funkční rozhraní Javy typem funkce, která přijímá jednu hodnotu nebo argument a provádí s ní nějaký druh zpracování a vrací booleovskou (pravda/nepravdivou) odpověď. Implementace funkčního rozhraní Predikát také zapouzdřuje logiku filtrování (proces, který se používá k filtrování komponent streamu na základě poskytnutého predikátu) v Javě.
Stejně jako funkční rozhraní Consumer má funkční rozhraní Preddicate také některá rozšíření. Jsou to IntPredicate, DoublePredicate a LongPredicate. Tyto typy predikátových funkčních rozhraní přijímají jako argumenty pouze primitivní datové typy nebo hodnoty.
Bi-predikát – Bi-Predicate je také rozšířením funkčního rozhraní Preddicate, které místo jednoho vezme dva argumenty, provede nějaké zpracování a vrátí booleovskou hodnotu.
Syntaxe predikátového funkčního rozhraní –
public interface Predicate { boolean test(T t); }>
Predikátové funkční rozhraní lze také implementovat pomocí třídy. Syntaxe pro implementaci predikátového funkčního rozhraní pomocí třídy je uvedena níže –
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>
Funkční rozhraní predikátu Java lze také implementovat pomocí výrazů Lambda. Příklad implementace funkčního rozhraní Preddicate je uveden níže –
Predicate predicate = (value) ->hodnota != null;>
Tato implementace funkčních rozhraní v Javě pomocí Java Lambda výrazů je lépe spravovatelná a efektivnější než implementace pomocí třídy, protože obě implementace provádějí stejnou práci, tj. vracejí stejný výstup.
3. Funkce
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. Existuje mnoho verzí rozhraní funkcí, protože primitivní typ nemůže implikovat argument obecného typu, takže potřebujeme tyto verze rozhraní funkcí. 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. V argumentu jsou také použity různé sekvence těchto primitivních typů.
Tyto verze jsou:
Bi-funkce
Bi-funkce v podstatě souvisí s funkcí. Kromě toho potřebuje dva argumenty, zatímco Funkce přijímá jeden argument.
Prototyp a syntaxe Bi-Function jsou uvedeny níže –
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>
Ve výše uvedeném kódu rozhraní jsou T a U vstupy a existuje pouze jeden výstup, který je R.
Unární operátor a binární operátor
Existují také dvě další funkční rozhraní, která se nazývají Unární operátor a Binární operátor. Oba rozšiřují funkci a bi-funkci. Jednoduše řečeno, unární operátor rozšiřuje funkci a binární operátor rozšiřuje bi-funkci.
Prototyp unárního operátoru a binárního operátoru je zmíněn níže:
i. Unární operátor
@FunctionalInterface public interface UnaryOperator extends Function { ……... }>
ii . Binární operátor
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>
Z výše uvedeného příkladu můžeme pochopit, že unární operátor přijímá pouze jeden argument a vrací pouze jeden argument. V unárním operátoru však musí být vstupní i výstupní hodnoty identické a stejného typu.
Na druhou stranu binární operátor nabývá dvou hodnot a vrací jednu hodnotu srovnatelnou s Bifunkcí, ale podobnou unárnímu operátoru, vstupní a výstupní typy hodnot musí být identické a stejného typu.
bash pro smyčku 1 až 10
4. Dodavatel
Funkční rozhraní Dodavatele je také typem funkčního rozhraní, které nepřijímá žádný vstup ani argument a přesto vrací jediný výstup. Tento typ funkčního rozhraní se obecně používá při líném generování hodnot. Funkční rozhraní dodavatele se také používají pro definování logiky pro generování libovolné sekvence. Například – Logiku Fibonacciho řady lze generovat pomocí Streamu. generovat metodu, která je implementována funkčním rozhraním dodavatele.
Různá rozšíření funkčního rozhraní Dodavatele obsahují mnoho dalších funkcí dodavatelů, jako je BooleanSupplier, DoubleSupplier, LongSupplier a IntSupplier. Návratovým typem všech těchto dalších specializací jsou pouze jejich odpovídající primitiva.
Syntaxe / prototyp funkčního rozhraní dodavatele je –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>
Níže je implementace výše uvedeného tématu:
Jáva
// 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ýstup
Geek GeeksQuiz Geek2>
Důležité body/pozorování ns:
Zde jsou některé důležité body týkající se funkčních rozhraní v Javě:
- Ve funkčních rozhraních je podporována pouze jedna abstraktní metoda. Pokud anotace funkčního rozhraní, tj. @FunctionalInterface není implementována nebo zapsána s funkčním rozhraním, lze v něm deklarovat více než jednu abstraktní metodu. V této situaci s více než jednou funkcí však toto rozhraní nebude nazýváno funkčním rozhraním. Říká se tomu nefunkční rozhraní.
- Anotace @FunctionalInterface není potřeba, protože je pouze dobrovolná. Toto je napsáno, protože to pomáhá při kontrole úrovně kompilátoru. Kromě toho je to volitelné.
- Do funkčního rozhraní lze přidat nekonečné množství metod (ať už statických nebo výchozích). Jednoduše řečeno, neexistuje žádné omezení pro funkční rozhraní obsahující statické a výchozí metody.
- Přepisování metod z nadřazené třídy neporušuje pravidla funkčního rozhraní v Javě.
- The funkce java.util balíček obsahuje mnoho vestavěných funkčních rozhraní v Javě 8.