Java uz visiem laikiem ir palikusi kā objektorientētas programmēšanas valoda. Izmantojot objektu orientētu programmēšanas valodu, mēs varam paziņot, ka viss Java programmēšanas valodā esošais objekts rotē, izņemot dažus primitīvos datu tipus un primitīvas metodes integritātes un vienkāršības nodrošināšanai. Programmēšanas valodā, ko sauc par Java, nav tikai funkciju. Funkcijas Java programmēšanas valodā ir daļa no klases, un, ja kāds vēlas tās izmantot, jebkuras funkcijas izsaukšanai ir jāizmanto klases vai klases objekts.
Java funkcionālās saskarnes
A funkcionāls interfeiss ir saskarne, kas satur tikai vienu abstraktu metodi. Viņiem var būt tikai viena funkcionalitāte, ko eksponēt. Sākot ar Java 8, lambda izteiksmes var izmantot, lai attēlotu funkcionāla interfeisa gadījumu. Funkcionālajam interfeisam var būt jebkurš noklusējuma metožu skaits. Palaist , ActionListener , un Salīdzināms ir daži no funkcionālo saskarņu piemēriem.
Funkcionālais interfeiss tiek papildus atzīts par Vienas abstraktās metodes saskarnes . Īsāk sakot, tos sauc arī par SAM saskarnes . Funkcionālās saskarnes Java ir jauna funkcija, kas lietotājiem nodrošina pamata programmēšanas pieeju.
Funkcionālās saskarnes ir iekļautas Java SE 8 ar Lambda izteiksmēm un metodes atsaucēm, lai padarītu kodu lasāmāku, tīrāku un vienkāršāku. Funkcionālās saskarnes ir saskarnes, kas nodrošina, ka tajās ir iekļauta tikai viena abstrakta metode. Funkcionālās saskarnes tiek izmantotas un izpildītas, interfeisu attēlojot ar an anotācija sauc @FunctionalInterface . Kā aprakstīts iepriekš, funkcionālās saskarnes var ietvert tikai vienu abstraktu metodi. Tomēr tie var ietvert jebkuru noklusējuma un statisko metožu daudzumu.
Funkcionālajās saskarnēs nav nepieciešams izmantot abstraktu atslēgvārdu, jo nav obligāti jāizmanto abstrakts atslēgvārds, jo pēc noklusējuma saskarnē definētā metode ir tikai abstrakta. Mēs varam saukt arī Lambda izteiksmes kā funkcionālās saskarnes gadījumu.
Java funkcionālo interfeisu piemērs
1. piemērs:
Pirms Java 8 mums bija jāizveido anonīmi iekšējās klases objekti vai jāievieš šīs saskarnes.
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();> >}> }> |
>
>Izvade
ups jēdzieni
New thread created>
2. piemērs:
Java 8 un jaunāku versiju, mēs varam piešķirt lambda izteiksme uz tā funkcionālā interfeisa objektu, piemēram:
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();> >}> }> |
>
>Izvade
New thread created>
@FunctionalInterface anotācija
@FunctionalInterface anotācija tiek izmantota, lai nodrošinātu, ka funkcionālajā saskarnē var būt tikai viena abstrakta metode. Ja ir vairākas abstraktas metodes, kompilators atzīmē ziņojumu “Negaidīta @FunctionalInterface anotācija”. Tomēr šīs anotācijas izmantošana nav obligāta.
Zemāk ir aprakstīta iepriekš minētās tēmas īstenošana:
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);> >}> }> |
>
>Izvade
25>
Dažas iebūvētas Java funkcionālās saskarnes
Kopš versijas Java SE 1.8 ir daudz saskarņu, kas tiek pārveidotas par funkcionālām saskarnēm. Visas šīs saskarnes ir anotētas ar @FunctionalInterface. Šīs saskarnes ir šādas -
- Runnable -> Šajā interfeisā ir tikai palaišanas () metode. Salīdzināms -> Šajā interfeisā ir tikai salīdzināta() metode. ActionListener -> Šajā saskarnē ir ietverta tikai metode actionPerformed(). Izsaucams -> Šajā interfeisā ir tikai call() metode.
Java SE 8 ietvēra četrus galvenos funkcionālo saskarņu veidus ko var izmantot vairākās situācijās, kā minēts tālāk:
- Patērētāju predikātu funkciju piegādātājs
Starp iepriekšējām četrām saskarnēm pirmajām trim saskarnēm, t.i., patērētājs, predikāts un funkcija, ir arī papildinājumi, kas ir sniegti zemāk -
- Patērētājs -> Divpatērētājs
- Predikāts -> Bi-Predikāts
- Funkcija -> Divfunkcija, Unārais operators, Binārais operators
1. Patērētājs
Funkcionālās saskarnes patērētāja saskarne ir tā, kas pieņem tikai vienu argumentu vai ģentrificētu argumentu. Patērētāja saskarnei nav atdeves vērtības. Tas neko neatdod. Ir arī funkcionāli patērētāja varianti — DoubleConsumer, IntConsumer un LongConsumer. Šie varianti pieņem primitīvas vērtības kā argumentus.
Izņemot šos variantus, ir arī vēl viens Consumer interfeisa variants, kas pazīstams kā Bi-Consumer.
Divpatērētājs - Bi-Consumer ir aizraujošākais Consumer interfeisa variants. Patērētāja saskarne izmanto tikai vienu argumentu, bet, no otras puses, divu patērētāju saskarne izmanto divus argumentus. Gan patērētājam, gan divpatērētājam nav atdeves vērtības. Tas arī neatgriež neko, tāpat kā patērētāja saskarne. To izmanto, atkārtojot kartes ierakstus.
Patērētāja funkcionālās saskarnes sintakse/prototips —
Consumer consumer = (value) ->System.out.println(value);>
Šī Java Consumer funkcionālās saskarnes ieviešana izdrukā vērtību, kas nodota kā parametrs drukas priekšrakstam. Šajā implementācijā tiek izmantota Java Lambda funkcija.
2. Predikāts
Zinātniskajā loģikā funkcija, kas pieņem argumentu un pretī ģenerē Būla vērtību kā atbildi, ir pazīstama kā predikāts. Tāpat Java programmēšanas valodā Java predikātu funkcionālais interfeiss ir funkcijas veids, kas pieņem vienu vērtību vai argumentu un veic to apstrādi un atgriež Būla (patiesa/nepatiesa) atbildi. Predikāta funkcionālās saskarnes ieviešana ietver arī filtrēšanas loģiku (procesu, ko izmanto, lai filtrētu straumes komponentus, pamatojoties uz nodrošināto predikātu) Java.
Tāpat kā patērētāju funkcionālajai saskarnei, arī Predicate funkcionālajam interfeisam ir daži paplašinājumi. Tie ir IntPredicate, DoublePredicate un LongPredicate. Šāda veida predikātu funkcionālās saskarnes kā argumentus pieņem tikai primitīvus datu tipus vai vērtības.
jsp javatpoint
Divu predikāts — Bi-Predicate ir arī funkcionālās saskarnes Predicate paplašinājums, kas viena vietā izmanto divus argumentus, veic apstrādi un atgriež Būla vērtību.
Predikātu funkcionālās saskarnes sintakse —
public interface Predicate { boolean test(T t); }> Predikātu funkcionālo saskarni var realizēt arī, izmantojot klasi. Sintakse predikātu funkcionālā interfeisa ieviešanai, izmantojot klasi, ir norādīta zemāk -
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }> Java predikātu funkcionālo interfeisu var ieviest arī, izmantojot Lambda izteiksmes. Predikāta funkcionālās saskarnes ieviešanas piemērs ir sniegts zemāk -
Predicate predicate = (value) ->vērtība != null;>
Šī Java funkcionālo saskarņu ieviešana, izmantojot Java Lambda izteiksmes, ir vieglāk pārvaldāma un efektīvāka nekā tā, kas ieviesta, izmantojot klasi, jo abas implementācijas veic vienu un to pašu darbu, t.i., atgriež vienu un to pašu izvadi.
java cast virkne uz int
3. Funkcija
Funkcija ir Java funkcionālas saskarnes veids, kas saņem tikai vienu argumentu un atgriež vērtību pēc nepieciešamās apstrādes. Ir daudz funkciju saskarņu versiju, jo primitīvais tips nevar ietvert vispārīga tipa argumentu, tāpēc mums ir vajadzīgas šīs funkciju saskarņu versijas. Daudzas dažādas funkciju saskarņu versijas ir instrumentālas un parasti tiek izmantotas primitīvos veidos, piemēram, double, int, long. Argumentā tiek izmantotas arī šo primitīvo tipu dažādās secības.
Šīs versijas ir:
Divfunkcija
Divkāršā funkcija ir būtiski saistīta ar funkciju. Turklāt tam ir nepieciešami divi argumenti, savukārt funkcija pieņem vienu argumentu.
Bi-Function prototips un sintakse ir norādīta zemāk -
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }> Iepriekš minētajā saskarnes kodā T un U ir ieejas, un ir tikai viena izeja, kas ir R.
Unārais operators un binārais operators
Ir arī divas citas funkcionālās saskarnes, kas tiek nosauktas unārais operators un binārais operators. Tie abi paplašina attiecīgi funkciju un divfunkciju. Vienkāršiem vārdiem sakot, Unary Operator paplašina funkciju, un Binary Operator paplašina Bi-Function.
Unārā operatora un binārā operatora prototips ir minēts zemāk:
i. Unārs operators
@FunctionalInterface public interface UnaryOperator extends Function { ……... }> ii . Binārais operators
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }> Mēs varam saprast iepriekš minēto piemēru, ka unārais operators pieņem tikai vienu argumentu un atgriež tikai vienu argumentu. Tomēr Unary Operator gan ievades, gan izvades vērtībām jābūt identiskām un viena veida.
No otras puses, binārais operators ņem divas vērtības un atgriež vienu vērtību, kas ir salīdzināma ar funkciju Bi-Function, bet līdzīga vienkāršajam operatoram, ievades un izvades vērtību veidiem ir jābūt identiskiem un viena veida.
4. Piegādātājs
Piegādātāja funkcionālais interfeiss ir arī funkcionālas saskarnes veids, kas neizmanto nekādu ievadi vai argumentu un tomēr atgriež vienu izvadi. Šāda veida funkcionālā saskarne parasti tiek izmantota slinkā vērtību ģenerēšanā. Piegādātāja funkcionālās saskarnes tiek izmantotas arī jebkuras secības ģenerēšanas loģikas noteikšanai. Piemēram – Fibonači sērijas loģiku var ģenerēt ar straumes palīdzību. ģenerēšanas metodi, kuru realizē Piegādātāja funkcionālais interfeiss.
Piegādātāja funkcionālās saskarnes dažādie paplašinājumi nodrošina daudzas citas piegādātāju funkcijas, piemēram, BooleanSupplier, DoubleSupplier, LongSupplier un IntSupplier. Visu šo turpmāko specializāciju atgriešanās veids ir tikai tiem atbilstošie primitīvie.
Piegādātāja funkcionālās saskarnes sintakse / prototips ir -
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }> Zemāk ir aprakstīta iepriekš minētās tēmas īstenošana:
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);> >}> >}> }> |
>
>Izvade
Geek GeeksQuiz Geek2>
Svarīgi punkti/novērojums ns:
Šeit ir daži svarīgi punkti par Java funkcionālajām saskarnēm:
- Funkcionālajās saskarnēs tiek atbalstīta tikai viena abstraktā metode. Ja funkcionāla interfeisa anotācija, t.i., @FunctionalInterface, nav ieviesta vai rakstīta ar funkcijas interfeisu, tajā var deklarēt vairāk nekā vienu abstraktu metodi. Tomēr šajā situācijā ar vairākām funkcijām šī saskarne netiks saukta par funkcionālu saskarni. To sauc par nefunkcionālu saskarni.
- @FunctionalInterface anotācija nav nepieciešama, jo tā ir tikai brīvprātīga. Tas ir rakstīts, jo tas palīdz pārbaudīt kompilatora līmeni. Turklāt tas nav obligāts.
- Funkcionālajam interfeisam var pievienot bezgalīgu skaitu metožu (statisku vai noklusējuma). Vienkāršiem vārdiem sakot, funkcionālajam interfeisam, kas satur statiskas un noklusējuma metodes, nav ierobežojumu.
- Vecākās klases metožu ignorēšana nepārkāpj Java funkcionālās saskarnes noteikumus.
- The java.util.function pakotnē ir daudz iebūvētu funkcionālo saskarņu Java 8.