logo

Toiminnalliset rajapinnat Javassa

Java on ikuisesti pysynyt olio-ohjelmointikielenä. Olio-ohjelmointikielellä voimme ilmoittaa, että kaikki Java-ohjelmointikielessä oleva kiertyy koko objektien sisällä, lukuun ottamatta joitain primitiivisiä tietotyyppejä ja primitiivisiä menetelmiä eheyden ja yksinkertaisuuden vuoksi. Java-nimisessä ohjelmointikielessä ei ole pelkästään toimintoja. Java-ohjelmointikielen funktiot ovat osa luokkaa, ja jos joku haluaa käyttää niitä, hänen on käytettävä luokan luokkaa tai objektia minkä tahansa funktion kutsumiseen.

Java toiminnalliset rajapinnat

A toimiva käyttöliittymä on käyttöliittymä, joka sisältää vain yhden abstraktin menetelmän. Niissä voi olla vain yksi toiminnallisuus näytettävänä. Java 8:sta eteenpäin, lambda-lausekkeet voidaan käyttää edustamaan toiminnallisen käyttöliittymän ilmentymää. Toiminnallisella käyttöliittymällä voi olla mikä tahansa määrä oletusmenetelmiä. Ajettava , ActionListener , ja Vertailukelpoinen ovat esimerkkejä toiminnallisista liitännöistä.



Toiminnallinen käyttöliittymä tunnetaan lisäksi nimellä Yhden abstraktin menetelmän rajapinnat . Lyhyesti sanottuna ne tunnetaan myös nimellä SAM-liitännät . Javan toiminnalliset rajapinnat ovat uusi ominaisuus, joka tarjoaa käyttäjille perusohjelmoinnin lähestymistavan.

Toiminnalliset rajapinnat sisältyvät Java SE 8:aan Lambda-lausekkeilla ja menetelmäviittauksilla, jotta koodista tulee luettavampaa, selkeämpää ja yksinkertaisempaa. Toiminnalliset rajapinnat ovat rajapintoja, jotka varmistavat, että ne sisältävät vain yhden abstraktin menetelmän. Toiminnallisia rajapintoja käytetään ja suoritetaan esittämällä rajapinta an huomautus nimeltä @FunctionalInterface . Kuten aiemmin on kuvattu, toiminnalliset rajapinnat voivat sisältää vain yhden abstraktin menetelmän. Ne voivat kuitenkin sisältää minkä tahansa määrän oletus- ja staattisia menetelmiä.

Toiminnallisissa käyttöliittymissä ei tarvitse käyttää abstraktia avainsanaa, koska abstraktin avainsanan käyttö on valinnaista, koska oletusarvoisesti käyttöliittymän sisällä määritetty menetelmä on vain abstrakti. Voimme kutsua myös Lambda-lausekkeita toiminnallisen käyttöliittymän ilmentymäksi.



Esimerkki Java toiminnallisista liitännöistä

Esimerkki 1:

Ennen Java 8:aa meidän piti luoda anonyymejä sisäisen luokan objekteja tai toteuttaa nämä rajapinnat.

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();> >}> }>

>

>

Lähtö

New thread created>

Esimerkki 2:

Java 8 alkaen, voimme määrittää lambda ilmaisu sen toiminnalliseen käyttöliittymäobjektiin seuraavasti:

Java




myivecricket sisään
// 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();> >}> }>

>

>

Lähtö

New thread created>

@FunctionalInterface Annotation

@FunctionalInterface-merkintää käytetään varmistamaan, että toiminnallisessa käyttöliittymässä voi olla vain yksi abstrakti menetelmä. Jos käytössä on useampi kuin yksi abstrakti menetelmä, kääntäjä ilmoittaa 'Unexpected @FunctionalInterface -merkintä' -sanoman. Tämän merkinnän käyttäminen ei kuitenkaan ole pakollista.

Alla on yllä olevan aiheen toteutus:

diana ankudinova

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);> >}> }>

>

>

Lähtö

25>

Jotkut sisäänrakennetut toiminnalliset Java-liitännät

Java SE 1.8:sta lähtien on olemassa monia käyttöliittymiä, jotka on muutettu toiminnallisiksi liitäntöiksi. Kaikki nämä liitännät on merkitty @FunctionalInterface-merkinnällä. Nämä rajapinnat ovat seuraavat -

    Runnable -> Tämä käyttöliittymä sisältää vain run()-menetelmän. Vertaileva –> Tämä käyttöliittymä sisältää vain vertailun()-menetelmän. ActionListener –> Tämä käyttöliittymä sisältää vain actionPerformed()-metodin. Kutsuttava –> Tämä käyttöliittymä sisältää vain call()-menetelmän.

Java SE 8 sisälsi neljä päätyyppiä toiminnallisia rajapintoja jota voidaan käyttää useissa alla mainituissa tilanteissa:

    Kuluttajapredikaattifunktion toimittaja

Edellisten neljän käyttöliittymän joukossa kolmessa ensimmäisessä käyttöliittymässä, eli kuluttaja, predikaatti ja toiminto, on myös lisäyksiä, jotka on annettu alla -

  1. Kuluttaja -> Bi-Consumer
  2. Predikaatti -> Bi-predikaatti
  3. Funktio -> Bi-Function, Unary Operator, Binary Operator

1. Kuluttaja

Toiminnallisen rajapinnan kuluttajarajapinta on se, joka hyväksyy vain yhden argumentin tai gentrifioidun argumentin. Kuluttajaliittymällä ei ole palautusarvoa. Se ei palauta mitään. Consumerista on myös toiminnallisia muunnelmia – DoubleConsumer, IntConsumer ja LongConsumer. Nämä muunnelmat hyväksyvät primitiiviset arvot argumentteina.

Näiden muunnelmien lisäksi on olemassa myös yksi muunnelma kuluttajaliittymästä, joka tunnetaan nimellä Bi-Consumer.

Bi-Consumer - Bi-Consumer on Consumer-käyttöliittymän jännittävin versio. Kuluttajarajapinta ottaa vain yhden argumentin, mutta toisaalta Bi-Consumer-liittymässä on kaksi argumenttia. Sekä Consumerilla että Bi-Consumerilla ei ole palautusarvoa. Se ei myöskään palauta mitään, kuten kuluttajaliittymä. Sitä käytetään iteroitaessa kartan merkintöjä.

Kuluttajakäyttöliittymän syntaksi / prototyyppi –

Consumer consumer = (value) ->System.out.println(value);>

Tämä Java Consumer -toiminnallisen käyttöliittymän toteutus tulostaa parametrina välitetyn arvon print-käskyyn. Tämä toteutus käyttää Javan Lambda-toimintoa.

2. Predikaatti

Tieteellisessä logiikassa funktio, joka hyväksyy argumentin ja vastineeksi tuottaa loogisen arvon vastauksena, tunnetaan predikaattina. Vastaavasti Java-ohjelmointikielessä Javan predikaattitoiminnallinen käyttöliittymä on eräänlainen funktio, joka hyväksyy yksittäisen arvon tai argumentin ja suorittaa sille jonkinlaisen prosessoinnin ja palauttaa loogisen (tosi/false) vastauksen. Toiminnallisen Predicate-rajapinnan toteutus kapseloi myös suodatuslogiikan (prosessi, jota käytetään stream-komponenttien suodattamiseen tarjotun predikaatin perusteella) Javassa.

Kuten Consumer-toiminnallisessa käyttöliittymässä, Predicate-toiminnallisessa käyttöliittymässä on myös joitain laajennuksia. Nämä ovat IntPredicate, DoublePredicate ja LongPredicate. Tämän tyyppiset predikaattitoiminnalliset rajapinnat hyväksyvät vain primitiivisiä tietotyyppejä tai arvoja argumentteina.

Bi-predikaatti – Bi-Predicate on myös Predicate-toiminnallisen käyttöliittymän laajennus, joka yhden sijaan ottaa kaksi argumenttia, suorittaa jonkin verran käsittelyä ja palauttaa loogisen arvon.

Predikaattifunktionaalisen käyttöliittymän syntaksi –

public interface Predicate { boolean test(T t); }>

Predikaattitoiminnallinen rajapinta voidaan toteuttaa myös luokan avulla. Syntaksi predikaattitoiminnallisen rajapinnan toteuttamiseksi luokkaa käyttämällä on annettu alla -

public class CheckForNull implements Predicate { @Override public boolean test(Object o) { return o != null; } }>

Java-predikaattitoiminnallinen käyttöliittymä voidaan toteuttaa myös lambda-lausekkeilla. Alla on esimerkki Predicate-toiminnallisen rajapinnan toteutuksesta –

Predicate predicate = (value) ->arvo != null;>

Tämä Java Lambda -lausekkeita käyttävien toiminnallisten rajapintojen toteutus Javassa on hallittavampi ja tehokkaampi kuin luokalla toteutettu, koska molemmat toteutukset tekevät samaa työtä, eli palauttavat saman tulosteen.

3. Toiminto

Funktio on Java-käyttöliittymän tyyppi, joka vastaanottaa vain yhden argumentin ja palauttaa arvon vaaditun käsittelyn jälkeen. Toimintoliitäntöistä on monia versioita, koska primitiivinen tyyppi ei voi tarkoittaa yleistä tyyppiargumenttia, joten tarvitsemme nämä funktiorajapintojen versiot. Monet erilaiset funktiorajapintojen versiot ovat instrumentaalisia ja niitä käytetään yleisesti primitiivisissä tyypeissä, kuten double, int, long. Näiden primitiivityyppien eri sekvenssejä käytetään myös argumentissa.

Nämä versiot ovat:

Bi-Function

Bi-toiminto liittyy olennaisesti toimintoon. Lisäksi se vaatii kaksi argumenttia, kun taas Function hyväksyy yhden argumentin.

Bi-Functionin prototyyppi ja syntaksi on annettu alla -

@FunctionalInterface public interface BiFunction { R apply(T t, U u); ....... }>

Yllä olevassa liitäntäkoodissa T ja U ovat tuloja, ja on vain yksi lähtö, joka on R.

Unaarinen operaattori ja binäärioperaattori

On myös kaksi muuta toiminnallista rajapintaa, jotka ovat nimeltään Unary Operator ja Binary Operator. Molemmat laajentavat toimintoa ja bi-toimintoa. Yksinkertaisesti sanottuna Unary Operator laajentaa Functionia ja Binary Operator laajentaa Bi-Functionia.

Unary Operatorin ja Binary Operatorin prototyyppi mainitaan alla:

i. Yksinäinen operaattori

@FunctionalInterface public interface UnaryOperator extends Function { ……... }>

ii . Binäärioperaattori

@FunctionalInterface public interface BinaryOperator extends BiFunction { ……... }>

Ymmärrämme edellä olevan esimerkin, että yksipuolinen operaattori hyväksyy vain yhden argumentin ja palauttaa vain yhden argumentin. Silti Unary Operatorissa sekä tulo- että lähtöarvojen on oltava identtisiä ja samaa tyyppiä.

Toisaalta binäärioperaattori ottaa kaksi arvoa ja palauttaa yhden arvon, joka on verrattavissa Bi-funktioon, mutta samanlainen kuin Unary Operator, tulo- ja lähtöarvotyyppien on oltava identtisiä ja samaa tyyppiä.

4. Toimittaja

Toimittajan toiminnallinen käyttöliittymä on myös eräänlainen toiminnallinen rajapinta, joka ei ota mitään syötettä tai argumenttia, mutta palauttaa kuitenkin yhden lähdön. Tämän tyyppistä toiminnallista käyttöliittymää käytetään yleensä laiskassa arvojen luomisessa. Toimittajien toiminnallisia rajapintoja käytetään myös minkä tahansa sekvenssin generoinnin logiikan määrittämiseen. Esimerkiksi – Fibonacci-sarjan taustalla oleva logiikka voidaan luoda Streamin avulla. generointimenetelmä, jonka toteuttaa Toimittajan toiminnallinen käyttöliittymä.

Toimittajan toiminnallisen käyttöliittymän eri laajennukset sisältävät monia muita toimittajien toimintoja, kuten BooleanSupplier, DoubleSupplier, LongSupplier ja IntSupplier. Kaikkien näiden lisäerikoistojen palautustyyppi on vain niitä vastaavat primitiivit.

Toimittajan toiminnallisen käyttöliittymän syntaksi / prototyyppi on –

@FunctionalInterface public interface Supplier{ // gets a result …………. // returns the specific result ………… T.get(); }>

Alla on yllä olevan aiheen toteutus:

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);> >}> >}> }>

>

sähkön edut

>

Lähtö

Geek GeeksQuiz Geek2>

Tärkeitä kohtia/havaintoja ns:

Tässä on joitain tärkeitä kohtia toiminnallisista Java-liittymistä:

  1. Toiminnallisissa liitännöissä tuetaan vain yhtä abstraktia menetelmää. Jos toiminnallisen käyttöliittymän, eli @FunctionalInterfacen, annotaatiota ei ole toteutettu tai kirjoitettu funktiorajapinnalla, sen sisällä voidaan ilmoittaa useampi kuin yksi abstrakti menetelmä. Tässä tilanteessa, jossa on useampi kuin yksi toiminto, kyseistä käyttöliittymää ei kuitenkaan kutsuta toiminnalliseksi rajapinnaksi. Sitä kutsutaan ei-toiminnalliseksi käyttöliittymäksi.
  2. @FunctionalInterface-merkintää ei tarvita, koska se on vain vapaaehtoinen. Tämä on kirjoitettu, koska se auttaa tarkistamaan kääntäjän tason. Tämän lisäksi se on valinnainen.
  3. Toiminnalliseen käyttöliittymään voidaan lisätä ääretön määrä menetelmiä (joko staattisia tai oletusarvoisia). Yksinkertaisesti sanottuna staattisia ja oletusmenetelmiä sisältävälle toiminnalliselle käyttöliittymälle ei ole rajoituksia.
  4. Pääluokan ohitusmenetelmät eivät riko Java-käyttöliittymän sääntöjä.
  5. The java.util.function paketti sisältää monia Java 8:n sisäänrakennettuja toiminnallisia rajapintoja.