logo

Interfaces funcionales de Java

Una interfaz funcional en Java es una interfaz que contiene solo un método abstracto. Las interfaces funcionales pueden tener múltiples métodos predeterminados o estáticos, pero solo un método abstracto.

1 millón de números

Desde Java 8 en adelante, se pueden utilizar expresiones lambda y referencias de métodos para representar la instancia de una interfaz funcional.



Ejemplo: uso de una interfaz funcional con expresión 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();  } } 

Producción
New thread created 

Explicación:

  • El programa anterior demuestra el uso de la expresión lambda con la interfaz funcional Runnable.
  • Runnable tiene un método abstracto run() por lo que califica como una interfaz funcional.
  • Lambda ()-> System.out.println('Nuevo hilo creado') define el método run().
  • new Thread().start() inicia un nuevo hilo que ejecuta el cuerpo lambda

Nota:

A F La interfaz funcional también puede ampliar otra interfaz funcional.



@Interfaz funcional Anotación

La anotación @FunctionalInterface se utiliza para garantizar que la interfaz funcional no pueda tener más de un método abstracto. En caso de que haya más de un método abstracto, el compilador marca un mensaje de "Anotación @FunctionalInterface inesperada". Sin embargo, no es obligatorio utilizar esta anotación.

Nota:

La anotación @FunctionalInterface es opcional, pero es una buena práctica utilizarla. Ayuda a detectar el error en una etapa temprana al asegurarse de que la interfaz tenga solo un método abstracto.



Ejemplo: definición de una interfaz funcional con la anotación @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);  } } 

Producción
25 

Explicación :

  • Square es una interfaz funcional con un único método de cálculo (int x).
  • Se utiliza una expresión lambda (int x) -> x * x para implementar el método de cálculo.
  • Lambda toma x como entrada y devuelve x * x.

Interfaces funcionales de Java antes de Java 8

Antes de Java 8 teníamos que crear objetos de clase internos anónimos o implementar estas interfaces. A continuación se muestra un ejemplo de cómo se implementó la interfaz Runnable antes de la introducción de expresiones lambda.

Ejemplo: Programa Java para demostrar la interfaz 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();  } } 

Producción
New thread created 

Interfaces funcionales Java integradas

Desde Java SE 1.8 en adelante hay muchas interfaces que se convierten en interfaces funcionales. Todas estas interfaces están anotadas con @FunctionalInterface. Estas interfaces son las siguientes:

  • Ejecutable: Esta interfaz sólo contiene la correr() método.
  • Comparable: Esta interfaz solo contiene el método compareTo().
  • Oyente de acción: Esta interfaz solo contiene el método actionPerformed().
  • Invocable: Esta interfaz solo contiene el método call().

Tipos de interfaces funcionales en Java

Java SE 8 incluyó cuatro tipos principales de interfaces funcionales que se pueden aplicar en múltiples situaciones, como se menciona a continuación:

  1. Consumidor
  2. Predicado
  3. Función 
  4. Proveedor

1. Consumidor 

El interfaz del consumidor de la interfaz funcional es la que acepta sólo un argumento o un argumento aburguesado. La interfaz del consumidor no tiene valor de retorno. No devuelve nada. También existen variantes funcionales del Consumer Doble Consumidor Consumidor internacional y Consumidor largo . Estas variantes aceptan valores primitivos como argumentos. 

Además de estas variantes, también existe una variante más de la interfaz del consumidor conocida como Bi-consumidor

Sintaxis:

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

Esta implementación de la interfaz funcional del consumidor de Java imprime el valor pasado como parámetro a la declaración de impresión. Esta implementación utiliza la función Lambda de Java.

2. Predicado 

El Interfaz de predicado representa una función con valor booleano de un argumento. Se usa comúnmente para operaciones de filtrado en transmisiones. Al igual que la interfaz funcional del consumidor, la interfaz funcional Predicate también tiene algunas extensiones. Estos son IntPredicado Predicado doble y Predicado largo . Estos tipos de interfaces funcionales de predicados aceptan solo valores o tipos de datos primitivos como argumentos.  

Sintaxis: 

Predicado de interfaz pública{
   prueba booleana(T t);
}

La interfaz funcional de predicado de Java también se puede implementar mediante expresiones Lambda.

Predicado predicado = (valor) -> valor! = nulo;

javamvc

3. Función

A función es un tipo de interfaz funcional en Java que recibe solo un argumento y devuelve un valor después del procesamiento requerido. Muchas versiones diferentes de las interfaces de funciones son instrumentales y se usan comúnmente en tipos primitivos como double int long.

Sintaxis:

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

  • Bifunción: El Bifunción está sustancialmente relacionado con una Función. Además, se necesitan dos argumentos, mientras que Function acepta un argumento. 
  • Operador unario y operador binario: También hay otras dos interfaces funcionales que se denominan como Operador unario y Operador binario. Ambos amplían la Función y la Bifunción respectivamente, donde tanto el tipo de entrada como el tipo de salida son iguales.

4. Proveedor

El Proveedor La interfaz funcional también es un tipo de interfaz funcional que no recibe ninguna entrada o argumento y, sin embargo, devuelve una única salida. Las diferentes extensiones de la interfaz funcional de Proveedores contienen muchas otras funciones de proveedores como Proveedor booleano DobleProveedor Proveedor largo y ProveedorInt . El tipo de retorno de todas estas especializaciones adicionales son únicamente sus primitivas correspondientes. 

Sintaxis:

Proveedorproveedor = () -> '¡Hola mundo!';

Ejemplo: Uso de la interfaz de predicado para filtrar cadenas

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

Producción
Geek GeeksQuiz Geek2 

Tabla de interfaces funcionales

Interfaces funcionales

Descripción

diferencia entre un león y un tigre

Método

Ejecutable

Representa una tarea que puede ser ejecutada por un hilo.

ejecución vacía()

Comparable

Compara dos objetos para ordenar.

int comparar con (T o)

Oyente de acción

Maneja un evento de acción en programación basada en eventos.

acción nula realizada (ActionEvent e)

invocable

Representa una tarea que puede devolver un resultado o generar una excepción.

V call() lanza una excepción

Consumidor

Acepta un único argumento de entrada y no devuelve ningún resultado.

aceptar nulo(T t)

rakhi sawant

Predicado

Acepta un único argumento y devuelve un resultado booleano.

prueba booleana(T t)

Función

Acepta un solo argumento y devuelve un resultado.

R aplicar(T t)

Proveedor

No requiere ningún argumento sino que proporciona un resultado.

obtener()

BiConsumidor

Acepta dos argumentos y no devuelve ningún resultado.

anular aceptar(T t U u)

guardar desde

bipredicado

Acepta dos argumentos y devuelve un resultado booleano.

prueba booleana(T t U u)

Bifunción

Acepta dos argumentos y devuelve un resultado.

R aplicar(T t U u)

Operador unario

Este es un caso especial de Función donde los tipos de entrada y salida son los mismos.

T aplicar(T t)

Operador binario

Este es un caso especial de BiFunction donde los tipos de entrada y salida son los mismos.

T aplicar(T t1 T t2)

Artículos relacionados

  • Java 8
  • Expresiones Lambda de Java