O interfață funcțională în Java este o interfață care conține o singură metodă abstractă. Interfețele funcționale pot avea mai multe metode implicite sau statice, dar o singură metodă abstractă.
Începând cu Java 8, expresiile lambda și referințele de metodă pot fi folosite pentru a reprezenta instanța unei interfețe funcționale.
Exemplu: Utilizarea unei interfețe funcționale cu expresie Lambda
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Ieșire
New thread created
Explicaţie:
- Programul de mai sus demonstrează utilizarea expresiei lambda cu interfața funcțională Runnable.
- Runnable are o metodă abstractă run(), așa că se califică ca o interfață funcțională.
- Lambda ()-> System.out.println('Fir nou creat') definește metoda run().
- new Thread().start() începe un nou thread care execută corpul lambda
Nota:
O f interfața uncțională poate extinde și o altă interfață funcțională.
@FunctionalInterface Adnotare
Adnotarea @FunctionalInterface este utilizată pentru a se asigura că interfața funcțională nu poate avea mai mult de o metodă abstractă. În cazul în care sunt prezente mai multe metode abstracte, compilatorul semnalează un mesaj „Adnotare @FunctionalInterface neașteptată”. Cu toate acestea, nu este obligatoriu să utilizați această adnotare.
Nota:
Adnotarea @FunctionalInterface este opțională, dar este o practică bună de utilizat. Ajută la identificarea erorii în stadiu incipient, asigurându-vă că interfața are o singură metodă abstractă.
Exemplu: Definirea unei interfețe funcționale cu @FunctionalInterface Adnotare
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); } }
Ieșire
25
Explicaţie :
- Square este o interfață funcțională cu o singură metodă de calcul (int x).
- O expresie lambda (int x) -> x * x este folosită pentru a implementa metoda de calcul.
- Lambda ia x ca intrare și returnează x * x.
Interfețe funcționale Java înainte de Java 8
Înainte de Java 8, a trebuit să creăm obiecte de clasă interioară anonime sau să implementăm aceste interfețe. Mai jos este un exemplu despre cum a fost implementată interfața Runnable înainte de introducerea expresiilor lambda.
Exemplu: Program Java pentru a demonstra interfața funcțională
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(); } }
Ieșire
New thread created
Interfețe funcționale Java încorporate
Începând cu Java SE 1.8, există multe interfețe care sunt convertite în interfețe funcționale. Toate aceste interfețe sunt adnotate cu @FunctionalInterface. Aceste interfețe sunt după cum urmează:
- Rugabil: Această interfață conține doar alerga() metodă.
- Comparabil: Această interfață conține doar metoda compareTo().
- ActionListener: Această interfață conține doar metoda actionPerformed().
- Apelabil: Această interfață conține doar metoda call().
Tipuri de interfețe funcționale în Java
Java SE 8 a inclus patru tipuri principale de interfețe funcționale care pot fi aplicate în mai multe situații, așa cum este menționat mai jos:
- Consumator
- Predicat
- Funcţie
- Furnizor
1. Consumatorul
The interfață de consum a interfeței funcționale este cea care acceptă un singur argument sau un argument gentrificat. Interfața de consum nu are valoare de returnare. Nu returnează nimic. Există și variante funcționale ale Consumatorului DoubleConsumer IntConsumer şi LongConsumer . Aceste variante acceptă valori primitive ca argumente.
fereastra.deschide javascript
În afară de aceste variante, există și o altă variantă a interfeței Consumer cunoscută ca Bi-consumator .
Sintaxă:
Consumator
consumator = (valoare) -> System.out.println(valoare);
Această implementare a interfeței funcționale Java Consumer tipărește valoarea transmisă ca parametru instrucțiunii print. Această implementare folosește funcția Lambda din Java.
2. Predicat
The Interfață cu predicat reprezintă o funcție cu valoare booleană a unui argument. Este folosit în mod obișnuit pentru operațiunile de filtrare în fluxuri. La fel ca interfața funcțională Consumer, interfața funcțională Predicate are și unele extensii. Acestea sunt IntPredicate DoublePredicate şi LongPredicate . Aceste tipuri de interfețe funcționale predicate acceptă doar tipuri de date sau valori primitive ca argumente.
Sintaxă:
interfață publică Predicat
{
test boolean(T t);
}
Interfața funcțională a predicatului Java poate fi implementată și folosind expresii Lambda.
Predicat
predicat = (valoare) -> valoare != nul;
3. Funcția
O funcţie este un tip de interfață funcțională în Java care primește doar un singur argument și returnează o valoare după procesarea necesară. Multe versiuni diferite ale interfețelor de funcții sunt instrumentale și sunt utilizate în mod obișnuit în tipurile primitive, cum ar fi double int long.
Sintaxă:
Funcţie
function = (valoare) -> valoare * valoare;
- Bi-funcție: The Bi-funcție este în mod substanțial legat de o Funcție. În plus, are nevoie de două argumente, în timp ce Function acceptă un singur argument.
- Operator unar și operator binar: Există, de asemenea, alte două interfețe funcționale care sunt denumite ca Operator unar şi Operator binar. Ambele extind funcția și, respectiv, bi-funcția, unde atât tipul de intrare, cât și tipul de ieșire sunt același.
4. Furnizor
The Furnizor interfața funcțională este, de asemenea, un tip de interfață funcțională care nu primește nicio intrare sau argument și totuși returnează o singură ieșire. Diferitele extensii ale interfeței funcționale Furnizor dețin multe alte funcții ale furnizorilor, cum ar fi Furnizor boolean Double Supplier Furnizor lung şi IntSupplier . Tipul de returnare al tuturor acestor specializări ulterioare este doar primitivele corespunzătoare.
Sintaxă:
Furnizor
furnizor = () -> 'Bună lume!';
Exemplu: Utilizarea interfeței predicate pentru a filtra șirurile
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); } } }
Ieșire
Geek GeeksQuiz Geek2
Tabelul interfețelor funcționale
Interfețe funcționale | Descriere | Metodă |
|---|---|---|
Rugabil | Reprezintă o sarcină care poate fi executată printr-un fir. | void run() |
Comparabil | Compară două obiecte pentru comandă. | int comparaTo(T o) |
ActionListener | Se ocupă de un eveniment de acțiune în programarea bazată pe evenimente. | void actionPerformed(ActionEvent e) |
Apelabil | Reprezintă o sarcină care poate returna un rezultat sau poate arunca o excepție. | V call() aruncă o excepție |
Consumator | Acceptă un singur argument de intrare și nu returnează niciun rezultat. | nul accept(T t) |
Predicat | Acceptă un singur argument și returnează un rezultat boolean. | test boolean (T t) |
Funcţie | Acceptă un singur argument și returnează un rezultat. | R aplica (T t) |
Furnizor | Nu preia niciun argument, ci oferă un rezultat. | T obține() |
BiConsumer | Acceptă două argumente și nu returnează niciun rezultat. | nul accept(T t U u) |
BiPredicat | Acceptă două argumente și returnează un rezultat boolean. | test boolean (T t U u) |
BiFunction | Acceptă două argumente și returnează un rezultat. | R aplica (T t U u) |
UnaryOperator | Acesta este un caz special de Funcție în care tipurile de intrare și de ieșire sunt aceleași. | T se aplică (T t) |
BinaryOperator | Acesta este un caz special de BiFunction în care tipurile de intrare și de ieșire sunt aceleași. | T se aplică (T t1 T t2) |
Articole înrudite
- Java 8
- Expresii Java Lambda