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.
postaviti u Javi
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
Javapublic 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
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(); } }
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; java arraylist metode
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
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); } } }
Izlaz
Geek GeeksQuiz Geek2
Tablica funkcionalnih sučelja
Funkcionalna sučelja | Opis linux preimenovati direktorij | 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) css podebljano |
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) red u Javi |
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