logo

Interfícies funcionals de Java

Una interfície funcional a Java és una interfície que només conté un mètode abstracte. Les interfícies funcionals poden tenir diversos mètodes predeterminats o estàtics, però només un mètode abstracte.

A partir de Java 8, es poden utilitzar expressions lambda i referències de mètodes per representar la instància d'una interfície funcional.



Exemple: Ús d'una interfície funcional amb expressió 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();  } } 

Sortida
New thread created 

Explicació:

  • El programa anterior demostra l'ús de l'expressió lambda amb la interfície funcional Runnable.
  • Runnable té un mètode abstracte run() per la qual cosa es qualifica com una interfície funcional.
  • Lambda ()-> System.out.println('Nou fil creat') defineix el mètode run().
  • new Thread().start() inicia un nou fil que executa el cos lambda

Nota:

A f la interfície funcional també pot ampliar una altra interfície funcional.



@Interfície Funcional Anotació

L'anotació @FunctionalInterface s'utilitza per garantir que la interfície funcional no pot tenir més d'un mètode abstracte. En cas que hi hagi més d'un mètode abstracte, el compilador marca un missatge "Anotació @FunctionalInterface inesperada". Tanmateix, no és obligatori utilitzar aquesta anotació.

Nota:

L'anotació @FunctionalInterface és opcional, però és una bona pràctica. Ajuda a detectar l'error en una fase inicial assegurant-se que la interfície només té un mètode abstracte.



sense senyal d'entrada

Exemple: definició d'una interfície funcional amb l'anotació @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);  } } 

Sortida
25 

Explicació :

  • Square és una interfície funcional amb un únic mètode de càlcul (int x).
  • S'utilitza una expressió lambda (int x) -> x * x per implementar el mètode de càlcul.
  • Lambda pren x com a entrada i retorna x * x.

Interfícies funcionals de Java abans de Java 8

Abans de Java 8 havíem de crear objectes anònims de classe interna o implementar aquestes interfícies. A continuació es mostra un exemple de com es va implementar la interfície Runnable abans de la introducció de les expressions lambda.

Exemple: Programa Java per demostrar la interfície funcional

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

Sortida
New thread created 

Interfícies funcionals de Java integrades

Des de Java SE 1.8 en endavant hi ha moltes interfícies que es converteixen en interfícies funcionals. Totes aquestes interfícies estan anotades amb @FunctionalInterface. Aquestes interfícies són les següents:

  • Es pot executar: Aquesta interfície només conté córrer () mètode.
  • Comparable: Aquesta interfície només conté el mètode compareTo().
  • ActionListener: Aquesta interfície només conté el mètode actionPerformed().
  • Invocable: Aquesta interfície només conté el mètode call().

Tipus d'interfícies funcionals en Java

Java SE 8 incloïa quatre tipus principals d'interfícies funcionals que es poden aplicar en diverses situacions, com s'esmenta a continuació:

  1. Consumidor
  2. Predicat
  3. Funció 
  4. Proveïdor

1. Consumidor 

El interfície de consum de la interfície funcional és la que només accepta un argument o un argument gentrificat. La interfície de consumidor no té valor de retorn. No retorna res. També hi ha variants funcionals del Consumidor DoubleConsumer IntConsumer i LongConsumer . Aquestes variants accepten valors primitius com a arguments. 

A part d'aquestes variants, també hi ha una variant més de la interfície de consum coneguda com Biconsumidor

Sintaxi:

Consumidor consumidor = (valor) -> System.out.println (valor);

Aquesta implementació de la interfície funcional Java Consumer imprimeix el valor passat com a paràmetre a la instrucció d'impressió. Aquesta implementació utilitza la funció Lambda de Java.

2. Predicat 

El Interfície de predicats representa una funció de valor booleà d'un argument. S'utilitza habitualment per a operacions de filtratge en fluxos. Igual que la interfície funcional del consumidor, la interfície funcional del predicat també té algunes extensions. Aquests són IntPredicate Doble predicat i Predicat llarg . Aquests tipus d'interfícies funcionals de predicats només accepten tipus de dades o valors primitius com a arguments.  

Sintaxi: 

Interfície pública Predicat{
   prova booleana (T t);
}

La interfície funcional del predicat Java també es pot implementar mitjançant expressions Lambda.

Predicat predicat = (valor) -> valor != nul;

conceptes bàsics de seleni

3. Funció

A funció és un tipus d'interfície funcional a Java que només rep un sol argument i retorna un valor després del processament requerit. Moltes versions diferents de les interfícies de funcions són instrumentals i s'utilitzen habitualment en tipus primitius com double int long.

Sintaxi:

Funció funció = (valor) -> valor * valor;

  • Bifunció: El Bifunció està relacionat substancialment amb una funció. A més, pren dos arguments, mentre que Function accepta un argument. 
  • Operador unari i operador binari: També hi ha altres dues interfícies funcionals que s'anomenen com Operador unari i Operador binari. Tots dos amplien la funció i la bifunció, respectivament, on tant el tipus d'entrada com el tipus de sortida són iguals.

4. Proveïdor

El Proveïdor La interfície funcional també és un tipus d'interfície funcional que no pren cap entrada ni argument i, tanmateix, retorna una única sortida. Les diferents extensions de la interfície funcional de proveïdors tenen moltes altres funcions de proveïdors, com ara BooleanSupplier DobleProveïdor Proveïdor llarg i IntProveïdor . El tipus de retorn de totes aquestes especialitzacions addicionals només són les seves primitives corresponents. 

Sintaxi:

Proveïdorproveïdor = () -> 'Hola món!';

Exemple: Ús de la interfície de predicats per filtrar cadenes

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

Sortida
Geek GeeksQuiz Geek2 

Taula d'interfícies funcionals

Interfícies funcionals

Descripció

Mètode

Es pot executar

Representa una tasca que es pot executar mitjançant un fil.

void run()

Comparable

Compara dos objectes per ordenar.

int comparaTo(T o)

llegir des del fitxer csv en java

ActionListener

Gestiona un esdeveniment d'acció en la programació basada en esdeveniments.

void actionPerformed(ActionEvent e)

Cridable

Representa una tasca que pot retornar un resultat o llançar una excepció.

V call() llança una excepció

Consumidor

Accepta un sol argument d'entrada i no retorna cap resultat.

acceptació nul (T t)

Predicat

Accepta un sol argument i retorna un resultat booleà.

prova booleana (T t)

Funció

Accepta un sol argument i retorna un resultat.

R aplica (T t)

Proveïdor

llenguatge java bàsic

No pren cap argument sinó que proporciona un resultat.

T aconsegueix()

Biconsumidor

Accepta dos arguments i no retorna cap resultat.

acceptar nul (T t U u)

BiPredicat

Accepta dos arguments i retorna un resultat booleà.

prova booleana (T t U u)

Bifunció

Accepta dos arguments i retorna un resultat.

R aplica (T t U u)

Operador unari

css per negreta

Aquest és un cas especial de la funció on els tipus d'entrada i de sortida són els mateixos.

T aplica (T t)

Operador binari

Aquest és un cas especial de BiFunction on els tipus d'entrada i de sortida són els mateixos.

T aplica (T t1 T t2)

Articles relacionats

  • Java 8
  • Expressions Lambda de Java