JavaRush /Blog Java /Random-ES /Pausa para el café #182. Interfaces funcionales en Java

Pausa para el café #182. Interfaces funcionales en Java

Publicado en el grupo Random-ES
Fuente: DZone Aquí hay una descripción general de las interfaces funcionales en Java: propósito, ejemplos, expresiones lambda y una lista de interfaces predefinidas. Pausa para el café #182.  Interfaces funcionales en Java - 1Como lenguaje de programación orientado a objetos, Java anteriormente no podía tener funciones independientes porque todo, excepto algunos tipos de datos y métodos primitivos en el lenguaje, gira en torno a clases y objetos. Sin embargo, Java 8 introdujo un nuevo concepto llamado Interfaz funcional y también algunas otras características como Lambda Expressions, Time API, Stream API, etc. ¿Cuáles son estas interfaces funcionales y cómo definirlas? ¡Vamos a averiguar!

¿Qué es una interfaz?

Una interfaz es un conjunto de reglas que determinan la interacción de los elementos del sistema. También se le conoce como el esquema de una clase que contiene métodos abstractos y constantes estáticas. Una interfaz puede contener uno o más métodos abstractos. Las interfaces también le permiten establecer requisitos para las clases, es decir, qué métodos se requieren de la clase. En pocas palabras, una interfaz es como un contrato que todas las clases implementadoras deben cumplir. He aquí un ejemplo:
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
Si la clase que implementa la interfaz no declara todos los métodos de la interfaz, el código no se ejecutará y generará un error: “ error : A1 no es abstracto y no anula un método abstracto en A1. " (error: A1 no es abstracto y no anula un método abstracto en A1). Antes de JDK 8, las interfaces no podían definir implementaciones, pero ahora se pueden agregar implementaciones predeterminadas para los métodos de interfaz. También podemos definir métodos estáticos y predeterminados, que se puede llamar sin un objeto en la interfaz Las interfaces se utilizan principalmente para lograr herencia múltiple y acoplamiento flexible en el código. Ahora que tenemos una comprensión clara de las interfaces, veamos qué es una interfaz funcional y cómo funciona.

¿Qué es una interfaz funcional?

La interfaz funcional también se conoce como interfaz del método abstracto único (SAM). Como sugiere el nombre, puede tener como máximo un método abstracto. Una interfaz funcional puede tener varios métodos estáticos y predeterminados con una implementación, así como un método abstracto adicional. Para marcar una interfaz como funcional, se utiliza la anotación @FunctionalInterface . Es necesario para evitar declarar erróneamente métodos adicionales. Lo que hace que la interfaz funcional sea tan popular es la capacidad de utilizar expresiones lambda para crear interfaces sin utilizar implementaciones de clases anónimas y engorrosas. El uso de la palabra clave abstracta en interfaces funcionales es opcional porque los métodos definidos dentro de una interfaz son abstractos por defecto.

¿Qué son las expresiones lambda?

Una expresión lambda es un método anónimo o sin nombre que no se ejecuta por sí solo, sino que se utiliza para implementar ciertos métodos de una interfaz funcional. Se define de la siguiente manera:
(parameter list) -> lambda body
El operador de flecha ( -> ) que ve en el código se conoce como operador lambda. Por ejemplo, si tenemos el siguiente método:
double getGoldenRatioValue() {
return 1.61803;
}
Usando una expresión lambda, podemos escribirla así:
() -> 1.61803
Como puede ver, el método en la función lambda no tiene parámetros, por lo que el lado izquierdo de la declaración está vacío. Dado que el lado derecho determina la acción, en este ejemplo devolverá el valor de la proporción áurea: 1,61803. Antes de Java 8, implementar interfaces o crear objetos de clase interna era crucial, pero con Java 8, ahora todo lo que necesitamos hacer es asignar expresiones lambda a interfaces funcionales.

Ejemplos de interfaces funcionales

Para crear interfaces funcionales, puede utilizar la anotación @FunctionalInterface o utilizar las interfaces funcionales predefinidas de Java.

Ejemplo 1

  • Primero, etiquetaremos @FunctionalInterface y crearemos una interfaz llamada MyInterface que se llama mediante el método abstracto getGoldenRationValue() .
  • Luego crearemos una clase pública principal para ejecutar el método.
  • Para usar una expresión lambda en una interfaz funcional, declararemos una referencia a MyInterfaceDemo y luego asignaremos la expresión lambda a esa referencia.
  • Finalmente, imprimiremos el valor de la proporción áurea usando la interfaz de referencia.
import java.lang.FunctionalInterface;

// Creación и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
Conclusión:
Valor de la proporción áurea = 1,61803

Ejemplo 2

  • En este ejemplo, usaremos la interfaz de función predefinida ToDoubleFunction , que toma un argumento T y devuelve un doble como salida.
  • ToDoubleFuntion contiene un método abstracto llamado applyasDouble() .
  • Finalmente, imprimimos la longitud completa del mensaje, incluidos los espacios.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
Conclusión:
54.0

Lista de interfaces funcionales preinstaladas

Ahora que sabemos cómo definir interfaces funcionales, veamos cuántas interfaces funcionales predefinidas (integradas) hay. Hay 4 tipos principales de interfaces funcionales que se pueden implementar en diferentes situaciones: Consumidor , Predicado , Función y Proveedor . Entre estas cuatro interfaces, Consumer , Function y Predicate tienen interfaces de funciones adicionales. Aquí hay una lista de todas las interfaces integradas o predefinidas en Java. Nota. T, U y R mencionados en la siguiente tabla representan el tipo de primer argumento (T), segundo argumento (U) y resultado (R) de la operación, respectivamente.
Interfaz Tipo
Ejecutable
BiConsumidor(T, U) T, U →
BiFunción(T, U, R) T, U → R
Operador binario T,T<→R
BiPredicado<T, U> T, U → booleano
Proveedor booleano → booleano
Consumidor T →
OperadorBinarioDoble doble, doble → doble
Doble Consumidor doble →
Doble Función doble → R
Predicado doble doble → booleano
DobleProveedor booleano →
Función DoubleToInt doble → entero
Función DoubleToLong doble → largo
OperadorUnarioDoble doble → doble
Función<T,R> T → R
OperadorIntBinario entero → entero
Consumidor internacional entero →
Función Int entero → R
IntPredicado int → booleano
ProveedorInt → int
Función IntToDouble int → doble
Función IntToLong int → largo
Operador IntUnario entero → entero
OperadorBinario Largo largo, largo → largo
Consumidor largo largo →
Función larga largo → R
Predicado largo largo →
Proveedor largo → largo
Función larga a doble largo → doble
Función LongToInt largo → entero
OperadorUnario Largo largo → largo
ObjDoubleConsumer T, doble →
ObjIntConsumidor T, entero →
ObjLongConsumidor T, larga →
Predicado T → booleano
Proveedor → T
ToDoubleBiFunction<T, U> T, U → doble
Para doble función T → doble
ToIntBiFunción<T, U> T, U → entero
Función ToInt T → entero
ToLongBiFunción<T, U> T, U → largo
Función ToLong T → largo
Operador unario T → T

resumámoslo

Algunas conclusiones clave para recordar de esta publicación:
  • La interfaz funciona como un mecanismo de abstracción.
  • Una interfaz funcional puede tener varios métodos estáticos y predeterminados con una implementación, así como un método abstracto adicional.
  • Los métodos definidos dentro de una interfaz funcional son abstractos de forma predeterminada, por lo que ya no es necesario utilizar la palabra clave abstracta .
  • Una expresión lambda es un método anónimo que no se ejecuta por sí solo, sino que se utiliza para implementar ciertos métodos de una interfaz funcional.
  • Para crear interfaces funcionales, puede utilizar la anotación @FunctionalInterface o utilizar las interfaces funcionales predefinidas de Java.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION