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
Javapublic 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.
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(); } }
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:
- Consumidor
- Predicado
- Función
- 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:
Proveedor
proveedor = () -> '¡Hola mundo!';
Ejemplo: Uso de la interfaz de predicado para filtrar cadenas
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); } } }
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