logo

Java toiminnalliset rajapinnat

Javassa toimiva käyttöliittymä on käyttöliittymä, joka sisältää vain yhden abstraktin menetelmän. Toiminnallisilla liitännöillä voi olla useita oletus- tai staattisia menetelmiä, mutta vain yksi abstrakti menetelmä.

Java 8:sta eteenpäin lambda-lausekkeita ja menetelmäviittauksia voidaan käyttää edustamaan toiminnallisen käyttöliittymän ilmentymää.



Esimerkki: Toiminnallisen käyttöliittymän käyttö Lambda-lausekkeen kanssa

Java
public class Geeks {    public static void main(String[] args) {    // Using lambda expression to implement Runnable  new Thread(() -> System.out.println('New thread created')).start();  } } 

Lähtö
New thread created 

Selitys:

  • Yllä oleva ohjelma esittelee lambda-lausekkeen käyttöä Runnable-toiminnallisen käyttöliittymän kanssa.
  • Runnablessa on yksi abstrakti menetelmä run(), joten se on toiminnallinen käyttöliittymä.
  • Lambda ()-> System.out.println('Uusi säie luotu') määrittää run()-metodin.
  • new Thread().start() aloittaa uuden säikeen, joka suorittaa lambda-rungon

Huomautus:

A f unctional interface voi myös laajentaa toista toiminnallista käyttöliittymää.



@FunctionalInterface Annotaatio

@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.

Huomautus:

@FunctionalInterface-merkintä on valinnainen, mutta se on hyvä käytäntö. Se auttaa havaitsemaan virheen varhaisessa vaiheessa varmistamalla, että käyttöliittymässä on vain yksi abstrakti menetelmä.



Esimerkki: Toiminnallisen käyttöliittymän määrittäminen @FunctionalInterface-merkinnällä

Java
@FunctionalInterface interface Square {  int calculate(int x); } class Geeks {  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 

Selitys :

  • Neliö on toiminnallinen rajapinta, jossa on yksi laskumenetelmä (int x).
  • Laskentamenetelmän toteuttamiseen käytetään lambda-lauseketta (int x) -> x * x.
  • Lambda ottaa x:n syötteenä ja palauttaa x * x:n.

Java toiminnalliset rajapinnat ennen Java 8:aa

Ennen Java 8:aa piti luoda anonyymejä sisäisen luokan objekteja tai toteuttaa nämä rajapinnat. Alla on esimerkki siitä, kuinka Runnable-liittymä toteutettiin ennen lambda-lausekkeiden käyttöönottoa.

pandas loc

Esimerkki: Java-ohjelma toiminnallisen käyttöliittymän esittelyyn

Java
class Geeks {  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 

Sisäänrakennetut toiminnalliset Java-rajapinnat

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

  • Ajettavissa: Tämä käyttöliittymä sisältää vain juokse () menetelmä.
  • Vertailukelpoinen: Tämä käyttöliittymä sisältää vain vertailuTo()-menetelmän.
  • ActionListener: Tämä käyttöliittymä sisältää vain actionPerformed()-menetelmän.
  • Soitettava: Tämä käyttöliittymä sisältää vain call()-menetelmän.

Toiminnallisten rajapintojen tyypit Javassa

Java SE 8 sisälsi neljä päätyyppiä toiminnallisia rajapintoja, joita voidaan käyttää useissa tilanteissa, kuten alla mainitaan:

  1. Kuluttaja
  2. Predikaatti
  3. Toiminto 
  4. Toimittaja

1. Kuluttaja 

The kuluttajaliittymä toiminnallisesta käyttöliittymästä on se, joka hyväksyy vain yhden argumentin tai gentrifioidun argumentin. Kuluttajaliittymällä ei ole palautusarvoa. Se ei palauta mitään. Kuluttajasta 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

Syntaksi:

Kuluttaja kuluttaja = (arvo) -> System.out.println(arvo);

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 

The Predikaattikäyttöliittymä edustaa yhden argumentin loogisen arvoista funktiota. Sitä käytetään yleisesti virtojen suodatustoimintoihin. Kuten kuluttajan toiminnallisessa käyttöliittymässä, myös Predicate-toiminnallisessa käyttöliittymässä on joitain laajennuksia. Nämä ovat IntPredicate DoublePredicate ja Pitkä Predikaatti . Tämän tyyppiset predikaattitoiminnalliset rajapinnat hyväksyvät vain primitiivisiä tietotyyppejä tai arvoja argumentteina.  

Syntaksi: 

julkinen käyttöliittymä Predikaatti{
   Boolen testi(T t);
}

Java-predikaattitoiminnallinen käyttöliittymä voidaan toteuttaa myös lambda-lausekkeilla.

Predikaatti predikaatti = (arvo) -> arvo != null;

Cassidy Hutchinsonin koulutus

3. Toiminto

A toiminto on Java-käyttöliittymän tyyppi, joka vastaanottaa vain yhden argumentin ja palauttaa arvon vaaditun käsittelyn jälkeen. Monet erilaiset funktiorajapintojen versiot ovat instrumentaalisia ja niitä käytetään yleisesti primitiivisissä tyypeissä, kuten double int long.

Syntaksi:

Toiminto funktio = (arvo) -> arvo * arvo;

  • Bi-toiminto: The Bi-Function liittyy olennaisesti toimintoon. Lisäksi se vaatii kaksi argumenttia, kun taas Function hyväksyy yhden argumentin. 
  • Unaarinen operaattori ja binäärioperaattori: On myös kaksi muuta toiminnallista rajapintaa, jotka on nimetty nimellä Yksinäinen operaattori ja Binäärioperaattori. Molemmat laajentavat toimintoa ja bi-toimintoa, kun sekä tulo- että lähtötyyppi ovat samat.

4. Toimittaja

The Toimittaja toiminnallinen käyttöliittymä on myös eräänlainen toiminnallinen käyttöliittymä, joka ei ota mitään syötettä tai argumenttia ja palauttaa silti yhden lähdön. 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. 

Syntaksi:

Toimittajatoimittaja = () -> 'Hei maailma!';

Esimerkki: Predikaattirajapinnan käyttäminen merkkijonojen suodattamiseen

Java
import java.util.*; import java.util.function.Predicate; class Geeks {  public static void main(String args[]) {    // create a list of strings  List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2');  // declare the predicate type as string and use lambda expression to create object  Predicate<String> p = (s) -> s.startsWith('G');  // Iterate through the list  for (String st : n) {    // call the test method  if (p.test(st))  System.out.println(st);  }  } } 

Lähtö
Geek GeeksQuiz Geek2 

Toiminnallisten liitäntöjen taulukko

Toiminnalliset rajapinnat

Kuvaus

Menetelmä

Ajettava

Se edustaa tehtävää, joka voidaan suorittaa säikeellä.

tyhjä juoksu ()

Vertailukelpoinen

Se vertaa kahta kohdetta tilausta varten.

int vertailla(T o)

ActionListener

Se käsittelee toimintatapahtumaa tapahtumaohjatussa ohjelmoinnissa.

topologiat

mitätön toimintoSuoritettu (ActionEvent e)

Soitettava

Se edustaa tehtävää, joka voi palauttaa tuloksen tai tehdä poikkeuksen.

V call() heittää Poikkeuksen

Kuluttaja

Se hyväksyy yhden syöteargumentin eikä palauta tulosta.

prioriteettijono

mitätön hyväksyntä (T t)

Predikaatti

Se hyväksyy yhden argumentin ja palauttaa loogisen tuloksen.

Boolen testi (T t)

Toiminto

Se hyväksyy yhden argumentin ja palauttaa tuloksen.

R soveltaa (T t)

Toimittaja

Se ei vaadi argumentteja, mutta antaa tuloksen.

T get()

BiConsumer

Se hyväksyy kaksi argumenttia eikä palauta tulosta.

javascript opetusohjelma

mitätön hyväksyntä (T t U u)

BiPredicate

Se hyväksyy kaksi argumenttia ja palauttaa loogisen tuloksen.

Boolen testi (T t U u)

BiFunction

Se hyväksyy kaksi argumenttia ja palauttaa tuloksen.

R hakea (T t U u)

UnaryOperator

Tämä on Functionin erikoistapaus, jossa tulo- ja lähtötyypit ovat samat.

T hakea (T t)

Binaarioperaattori

Tämä on BiFunctionin erikoistapaus, jossa tulo- ja lähtötyypit ovat samat.

T soveltaa (T t1 T t2)

Aiheeseen liittyvät artikkelit

  • Java 8
  • Java Lambda -lausekkeet