„Java“ amžinai išliko objektinio programavimo kalba. Naudodami objektinę programavimo kalbą galime paskelbti, kad viskas, kas yra Java programavimo kalboje, sukasi per visus objektus, išskyrus kai kuriuos primityvius duomenų tipus ir primityvius metodus, skirtus vientisumui ir paprastumui užtikrinti. Programavimo kalboje, vadinamoje Java, nėra vien funkcijų. Funkcijos Java programavimo kalba yra klasės dalis, o jei kas nors nori jomis naudotis, bet kuriai funkcijai iškviesti turi naudoti klasės arba klasės objektą.
Java funkcinės sąsajos
A funkcinė sąsaja yra sąsaja, kurioje yra tik vienas abstraktus metodas. Jie gali turėti tik vieną funkciją. Nuo 8 versijos Java, lambda išraiškos gali būti naudojamas funkcinės sąsajos egzemplioriui pavaizduoti. Funkcinė sąsaja gali turėti bet kokį numatytųjų metodų skaičių. Paleisti , ActionListener , ir Palyginamas yra keletas funkcinių sąsajų pavyzdžių.
Funkcinė sąsaja papildomai pripažįstama kaip Vieno abstrakčiojo metodo sąsajos . Trumpai tariant, jie taip pat žinomi kaip SAM sąsajos . Funkcinės „Java“ sąsajos yra nauja funkcija, suteikianti vartotojams pagrindinio programavimo metodą.
Funkcinės sąsajos įtrauktos į „Java SE 8“ su „Lambda“ išraiškomis ir metodo nuorodomis, kad kodas būtų skaitomesnis, švaresnis ir aiškesnis. Funkcinės sąsajos yra sąsajos, užtikrinančios, kad jos apima tik vieną abstraktų metodą. Funkcinės sąsajos naudojamos ir vykdomos vaizduojant sąsają su anotacija vadinama @Funkcinė sąsaja . Kaip aprašyta anksčiau, funkcinėse sąsajose gali būti tik vienas abstraktus metodas. Tačiau jie gali apimti bet kokį numatytųjų ir statinių metodų skaičių.
Funkcinėse sąsajose nereikia naudoti abstrakčiojo raktinio žodžio, nes nebūtina naudoti abstraktų raktinį žodį, nes pagal numatytuosius nustatymus sąsajoje apibrėžtas metodas yra tik abstraktus. Lambda išraiškas taip pat galime vadinti funkcinės sąsajos pavyzdžiu.
„Java“ funkcinių sąsajų pavyzdys
1 pavyzdys:
Prieš „Java 8“ turėjome sukurti anoniminius vidinės klasės objektus arba įdiegti šias sąsajas.
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();> >}> }> |
paslėptos programos
>
>
registro atmintisIšvestis
New thread created>
2 pavyzdys:
„Java 8“ ir naujesnė versija, galime priskirti lambda išraiška į savo funkcinės sąsajos objektą, pavyzdžiui:
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();> >}> }> |
>
>Išvestis
New thread created>
@FunctionalInterface anotacija
@FunctionalInterface anotacija naudojama siekiant užtikrinti, kad funkcinė sąsaja negali turėti daugiau nei vieno abstrakčiojo metodo. Jei yra daugiau nei vienas abstraktus metodas, kompiliatorius pažymi pranešimą „Netikėta @FunctionalInterface anotacija“. Tačiau naudoti šią anotaciją nėra privaloma.
Žemiau pateikiamas aukščiau pateiktos temos įgyvendinimas:
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);> >}> }> |
>
>Išvestis
eilutėje java
25>
Kai kurios įmontuotos Java funkcinės sąsajos
Nuo Java SE 1.8 versijos yra daug sąsajų, kurios konvertuojamos į funkcines sąsajas. Visos šios sąsajos yra pažymėtos @FunctionalInterface. Šios sąsajos yra tokios –
- Vykdomas –> Šioje sąsajoje yra tik metodas run(). Comparable –> Šioje sąsajoje yra tik palyginimas() metodas. ActionListener –> Šioje sąsajoje yra tik metodas actionPerformed(). Iškviečiamas –> Šioje sąsajoje yra tik call() metodas.
„Java SE 8“ apėmė keturias pagrindines funkcinių sąsajų rūšis kuris gali būti taikomas keliose situacijose, kaip nurodyta toliau:
- Vartotojo predikatinės funkcijos tiekėjas
Tarp keturių ankstesnių sąsajų pirmosios trys sąsajos, ty Vartotojas, Predikatas ir Funkcija, taip pat turi priedų, pateiktų žemiau –
- Vartotojas -> Dvi vartotojas
- Predikatas -> Bi-Predikatas
- Funkcija -> Dviejų funkcijų, vienkartinis operatorius, dvejetainis operatorius
1. Vartotojas
Funkcinės sąsajos vartotojo sąsaja yra ta, kuri priima tik vieną argumentą arba gentrifikuotą argumentą. Vartotojo sąsaja neturi grąžinimo vertės. Tai nieko negrąžina. Taip pat yra funkcinių vartotojų variantų – „DoubleConsumer“, „IntConsumer“ ir „LongConsumer“. Šie variantai priima primityvias reikšmes kaip argumentus.
Be šių variantų, yra dar vienas vartotojo sąsajos variantas, žinomas kaip „Bi-Consumer“.
Dvi vartotojas – Bi-Consumer yra labiausiai jaudinantis vartotojo sąsajos variantas. Vartotojo sąsaja turi tik vieną argumentą, o iš kitos pusės, dviejų vartotojų sąsaja turi du argumentus. Tiek „Consumer“, tiek „Bi-Consumer“ neturi grąžinimo vertės. Ji taip pat nieko negrąžina, kaip ir vartotojo sąsaja. Jis naudojamas kartojant per žemėlapio įrašus.
Vartotojo funkcinės sąsajos sintaksė / prototipas –
Consumer consumer = (value) ->System.out.println(value);>
Šis „Java Consumer“ funkcinės sąsajos įgyvendinimas atspausdina reikšmę, perduotą kaip parametrą spausdinimo sakiniui. Šis įgyvendinimas naudoja „Java“ funkciją „Lambda“.
2. Predikatas
Mokslinėje logikoje funkcija, kuri priima argumentą ir savo ruožtu generuoja loginę reikšmę kaip atsakymą, yra žinoma kaip predikatas. Panašiai Java programavimo kalboje predikatinė funkcinė Java sąsaja yra funkcijos tipas, kuris priima vieną reikšmę arba argumentą ir atlieka tam tikrą jos apdorojimą bei pateikia loginį (tiesa / klaidinga) atsakymą. Predikato funkcinės sąsajos įgyvendinimas taip pat apima filtravimo logiką (procesą, kuris naudojamas srauto komponentams filtruoti pateikto predikato pagrindu) programoje Java.
Kaip ir vartotojo funkcinė sąsaja, „Predicate“ funkcinė sąsaja taip pat turi tam tikrų plėtinių. Tai yra „IntPredicate“, „DoublePredicate“ ir „LongPredicate“. Šio tipo predikatinės funkcinės sąsajos kaip argumentus priima tik primityvius duomenų tipus arba reikšmes.
Dvi predikatas – Bi-Predicate taip pat yra Predicate funkcinės sąsajos plėtinys, kuris vietoj vieno paima du argumentus, atlieka tam tikrą apdorojimą ir grąžina loginę reikšmę.
Predikato funkcinės sąsajos sintaksė –
public interface Predicate { boolean test(T t); }> Predikato funkcinė sąsaja taip pat gali būti įgyvendinta naudojant klasę. Predikatinės funkcinės sąsajos, naudojant klasę, diegimo sintaksė pateikta žemiau –
public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }> Java predikato funkcinė sąsaja taip pat gali būti įgyvendinta naudojant Lambda išraiškas. Toliau pateikiamas predikato funkcinės sąsajos įgyvendinimo pavyzdys –
žemės riešutai vs žemės riešutai
Predicate predicate = (value) ->reikšmė != null;>
Šis „Java“ funkcinių sąsajų diegimas naudojant „Java Lambda“ išraiškas yra lengviau valdomas ir efektyvesnis nei įdiegtas naudojant klasę, nes abu diegimai atlieka tą patį darbą, ty grąžina tą patį išvestį.
3. Funkcija
Funkcija yra funkcinės Java sąsajos tipas, kuris gauna tik vieną argumentą ir grąžina reikšmę po reikiamo apdorojimo. Yra daug funkcijų sąsajų versijų, nes primityvus tipas negali reikšti bendro tipo argumento, todėl mums reikia šių funkcijų sąsajų versijų. Daugelis skirtingų funkcijų sąsajų versijų yra instrumentinės ir dažniausiai naudojamos primityviuose tipuose, pvz., double, int, long. Argumente taip pat naudojamos skirtingos šių primityvių tipų sekos.
Šios versijos yra:
Dvi funkcija
Dvi funkcija iš esmės yra susijusi su funkcija. Be to, reikia dviejų argumentų, o funkcija priima vieną argumentą.
„Bi-Function“ prototipas ir sintaksė pateikta žemiau –
@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }> Aukščiau pateiktame sąsajos kode T ir U yra įėjimai, o yra tik vienas išėjimas, kuris yra R.
Unarinis operatorius ir dvejetainis operatorius
Taip pat yra dar dvi funkcinės sąsajos, pavadintos „Unary Operator“ ir „Binary Operator“. Jie abu atitinkamai išplečia funkciją ir dvigubą funkciją. Paprastais žodžiais tariant, Unary Operator išplečia funkciją, o dvejetainis operatorius – Bi-Function.
Vienkartinio operatoriaus ir dvejetainio operatoriaus prototipas paminėtas toliau:
i. Unary Operator
@FunctionalInterface public interface UnaryOperator extends Function { ……... }> ii . Dvejetainis operatorius
@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }> Aukščiau pateiktą pavyzdį galime suprasti, kad vienkartinis operatorius priima tik vieną argumentą ir pateikia tik vieną argumentą. Vis dėlto Unary Operator įvesties ir išvesties reikšmės turi būti identiškos ir to paties tipo.
Kita vertus, dvejetainis operatorius paima dvi reikšmes ir grąžina vieną reikšmę, panašią į „Bi-Function“, bet panašią į „Unary Operator“, įvesties ir išvesties verčių tipai turi būti identiški ir to paties tipo.
Atnaujinkite sql su prisijungimu
4. Tiekėjas
Tiekėjo funkcinė sąsaja taip pat yra funkcinės sąsajos tipas, kuris nepriima jokios įvesties ar argumentų ir vis dėlto pateikia vieną išvestį. Šio tipo funkcinė sąsaja paprastai naudojama tingiai generuojant vertes. Tiekėjo funkcinės sąsajos taip pat naudojamos bet kokios sekos generavimo logikai apibrėžti. Pavyzdžiui – „Fibonacci“ serijos logika gali būti sukurta naudojant srautą. generavimo metodas, kurį įgyvendina Tiekėjo funkcinė sąsaja.
Įvairūs tiekėjo funkcinės sąsajos plėtiniai turi daug kitų tiekėjų funkcijų, tokių kaip BooleanSupplier, DoubleSupplier, LongSupplier ir IntSupplier. Visų šių tolesnių specializacijų grąžinimo tipas yra tik atitinkami primityvai.
Tiekėjo funkcinės sąsajos sintaksė / prototipas yra –
@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }> Žemiau pateikiamas aukščiau pateiktos temos įgyvendinimas:
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);> >}> >}> }> |
>
>Išvestis
Geek GeeksQuiz Geek2>
Svarbūs punktai / pastebėjimas ns:
Štai keletas svarbių dalykų, susijusių su funkcinėmis „Java“ sąsajomis:
- Funkcinėse sąsajose palaikomas tik vienas abstraktus metodas. Jei funkcinės sąsajos anotacija, ty @FunctionalInterface, neįdiegta arba neparašyta su funkcine sąsaja, joje gali būti deklaruojamas daugiau nei vienas abstraktus metodas. Tačiau šioje situacijoje su daugiau nei viena funkcija ta sąsaja nebus vadinama funkcine sąsaja. Tai vadinama nefunkcine sąsaja.
- @FunctionalInterface anotacija nereikalinga, nes ji yra tik savanoriška. Tai parašyta, nes padeda patikrinti kompiliatoriaus lygį. Be to, tai neprivaloma.
- Prie funkcinės sąsajos galima pridėti begalę metodų (nesvarbu, statinių ar numatytųjų). Paprastais žodžiais tariant, funkcinei sąsajai, kurioje yra statiniai ir numatytieji metodai, nėra jokių apribojimų.
- Pirminės klasės metodų nepaisymas nepažeidžia funkcinės „Java“ sąsajos taisyklių.
- The java.util.function pakete yra daug integruotų funkcinių sąsajų Java 8.