Java funkcionalna sučelja
Funkcionalno sučelje u Javi je sučelje koje sadrži samo jednu apstraktnu metodu. Funkcionalna sučelja mogu imati više zadanih ili statičkih metoda, ali samo jednu apstraktnu metodu.
Od Jave 8 pa nadalje lambda izrazi i reference metoda mogu se koristiti za predstavljanje instance funkcionalnog sučelja.
Primjer: Korištenje funkcionalnog sučelja s lambda izrazom
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 (); } }
Izlaz
New thread created
Obrazloženje:
- Gornji program demonstrira korištenje lambda izraza s funkcionalnim sučeljem Runnable.
- Runnable ima jednu apstraktnu metodu run() pa se kvalificira kao funkcionalno sučelje.
- Lambda ()-> System.out.println('Stvorena je nova nit') definira metodu run().
- new Thread().start() pokreće novu nit koja izvršava lambda tijelo
Bilješka:
A f nefunkcionalno sučelje također može proširiti drugo funkcionalno sučelje.
@Funkcionalno sučelje Anotacija
Napomena @FunctionalInterface koristi se kako bi se osiguralo da funkcionalno sučelje ne može imati više od jedne apstraktne metode. U slučaju da je prisutno više od jedne apstraktne metode, prevodilac označava poruku 'Neočekivana napomena @FunctionalInterface'. Međutim, korištenje ove napomene nije obavezno.
Bilješka:
Bilješka @FunctionalInterface nije obavezna, ali je dobra praksa za korištenje. Pomaže u otkrivanju pogreške u ranoj fazi osiguravajući da sučelje ima samo jednu apstraktnu metodu.
Primjer: Definiranje funkcionalnog sučelja s napomenom @FunctionalInterface
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 ); } }
Izlaz
25
Obrazloženje :
- Square je funkcionalno sučelje s jednom metodom izračuna (int x).
- Lambda izraz (int x) -> x * x koristi se za implementaciju metode izračuna.
- Lambda uzima x kao ulaz i vraća x * x.
Java funkcionalna sučelja prije Jave 8
Prije Jave 8 morali smo stvarati anonimne unutarnje objekte klase ili implementirati ova sučelja. Ispod je primjer kako je Runnable sučelje implementirano prije uvođenja lambda izraza.
Primjer: Java program za demonstraciju funkcionalnog sučelja
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 (); } }
Izlaz
New thread created
Ugrađena Java funkcionalna sučelja
Od Java SE 1.8 nadalje postoji mnogo sučelja koja se pretvaraju u funkcionalna sučelja. Sva ova sučelja označena su s @FunctionalInterface. Ova sučelja su sljedeća:
- Pokretljivo: Ovo sučelje sadrži samo trčanje() metoda.
- Usporedivo: Ovo sučelje sadrži samo metodu compareTo().
- ActionListener: Ovo sučelje sadrži samo metodu actionPerformed().
- Poziv: Ovo sučelje sadrži samo metodu call().
Vrste funkcionalnih sučelja u Javi
Java SE 8 uključuje četiri glavne vrste funkcionalnih sučelja koja se mogu primijeniti u više situacija kao što je navedeno u nastavku:
- Potrošač
- Predikat
- Funkcija
- Dobavljač
1. Potrošač
The potrošačko sučelje funkcionalnog sučelja je onaj koji prihvaća samo jedan argument ili gentrificirani argument. Potrošačko sučelje nema povratnu vrijednost. Ništa ne vraća. Postoje i funkcionalne varijante Potrošača Dvostruki potrošač IntConsumer i LongConsumer . Ove varijante prihvaćaju primitivne vrijednosti kao argumente.
Osim ovih varijanti postoji još jedna varijanta potrošačkog sučelja poznata kao Dvostruki potrošač .
Sintaksa:
Potrošač
potrošač = (vrijednost) -> System.out.println(vrijednost);
Ova implementacija funkcionalnog sučelja Java Consumer ispisuje vrijednost proslijeđenu kao parametar naredbi za ispis. Ova implementacija koristi Lambda funkciju Jave.
2. Predikat
The Predikatno sučelje predstavlja funkciju s booleovom vrijednošću jednog argumenta. Obično se koristi za operacije filtriranja u tokovima. Baš kao i potrošačko funkcionalno sučelje, predikatno funkcionalno sučelje također ima neka proširenja. Ovo su IntPredicate Dvostruki predikat i Dugi predikat . Ove vrste predikatnih funkcionalnih sučelja prihvaćaju samo primitivne tipove podataka ili vrijednosti kao argumente.
Sintaksa:
javno sučelje Predikat
{
Booleov test(T t);
}
Funkcionalno sučelje Java predikata također se može implementirati pomoću Lambda izraza.
Predikat
predikat = (vrijednost) -> vrijednost != null;
3. Funkcija
A funkcija je vrsta funkcionalnog sučelja u Javi koja prima samo jedan argument i vraća vrijednost nakon potrebne obrade. Mnoge različite verzije funkcijskih sučelja su instrumentalne i obično se koriste u primitivnim tipovima kao što je double int long.
Sintaksa:
Funkcija
funkcija = (vrijednost) -> vrijednost * vrijednost;
- Bi-funkcija: The Dvostruka funkcija bitno je povezan s funkcijom. Osim toga, uzima dva argumenta, dok funkcija prihvaća jedan argument.
- Unarni operator i binarni operator: Postoje i druga dva funkcionalna sučelja koja su nazvana kao Unarni operator i Binarni operator. Oboje proširuju Funkciju i Bi-Funkciju gdje su i vrsta ulaza i vrsta izlaza iste.
4. Dobavljač
The Dobavljač funkcionalno sučelje također je vrsta funkcionalnog sučelja koje ne prima nikakav ulaz ili argument, a vraća samo jedan izlaz. Različita proširenja funkcionalnog sučelja dobavljača sadrže mnoge druge funkcije dobavljača kao što su BooleanSupplier DoubleSupplier LongSupplier i IntSupplier . Povratni tip svih ovih daljnjih specijalizacija samo su njihove odgovarajuće primitive.
Sintaksa:
Dobavljač
dobavljač = () -> 'Hello World!';
Primjer: Korištenje predikatnog sučelja za filtriranje nizova
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 ); } } }
Izlaz
Geek GeeksQuiz Geek2
Tablica funkcionalnih sučelja
| Funkcionalna sučelja | Opis | metoda |
|---|---|---|
| Pokretljiv | Predstavlja zadatak koji može izvršiti nit. | void run() |
| Usporedivo | Uspoređuje dva objekta za naručivanje. | int compareTo(T o) |
| ActionListener | Obrađuje akcijski događaj u programiranju vođenom događajima. | void actionPerformed(ActionEvent e) |
| Poziv | Predstavlja zadatak koji može vratiti rezultat ili izbaciti iznimku. | V call() izbacuje iznimku |
| Potrošač | Prihvaća jedan ulazni argument i ne vraća nikakav rezultat. | nevažeći prihvatiti (T t) |
| Predikat | Prihvaća jedan argument i vraća Booleov rezultat. | Booleov test (T t) |
| Funkcija | Prihvaća jedan argument i vraća rezultat. | R primijeniti (T t) |
| Dobavljač | Ne uzima nikakve argumente, već daje rezultat. | T get() |
| BiPotrošač | Prihvaća dva argumenta i ne vraća nikakav rezultat. | nevažeći prihvatiti (T t U u) |
| Bipredikat | Prihvaća dva argumenta i vraća Booleov rezultat. | Booleov test (T t U u) |
| Bifunkcija | Prihvaća dva argumenta i vraća rezultat. | R primijeniti (T t U u) |
| Unarni operator | Ovo je poseban slučaj funkcije gdje su tipovi ulaza i izlaza isti. | T primijeniti (T t) |
| BinarniOperator | Ovo je poseban slučaj BiFunctiona gdje su tipovi ulaza i izlaza isti. | T primijeniti (T t1 T t2) |
Povezani članci
- Java 8
- Java Lambda izrazi