logo

Interfețe funcționale Java

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

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();  } } 

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ă

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();  } } 

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:

  1. Consumator
  2. Predicat
  3. Funcţie 
  4. 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ă:

Furnizorfurnizor = () -> 'Bună lume!';

Exemplu: Utilizarea interfeței predicate pentru a filtra șirurile

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);  }  } } 

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