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
Javapublic 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
Javaclass 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:
- Kuluttaja
- Predikaatti
- Toiminto
- 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:
Toimittaja
toimittaja = () -> 'Hei maailma!';
Esimerkki: Predikaattirajapinnan käyttäminen merkkijonojen suodattamiseen
Javaimport 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