¿Qué es un Java Functional Interface? . Java8 incluye muchas novedades y entra ellas destacan las expresiones lambda. Recordemos que una expresión lambda define el comportamiento de una función.
Podemos usar la expresión lambda en nuestro código Java :
package com.arquitecturajava.functional; public class Principal { public static void main(String[] args) { (x, y) -> x + y; } }
Sin embargo ella sola no compila ya que necesitamos igualarla a una variable lo que no tenemos claro es a qué exactamente.
El concepto de Java Functional Interface
Es aquí donde aparece el concepto de Java Functional Interface. Un interface funcional es aquel interface que solo dispone de un método abstracto. Recordemos que a día de hoy los interfaces han evolucionado mucho y pueden disponer de métodos por defecto. Así pues vamos a igualar nuestra expresión lambda a un interface funcional
Vamos a verlo en código:
package com.arquitecturajava.functional; public class Principal { interface Matematicas { public double operacion(double x, double y); } public static void main(String[] args) { Matematicas o = (x, y) -> x + y; System.out.println(o.operacion(2, 3)); } }
Acabamos de declarar el interface Matemáticas y hemos añadido un método para la operación , si ejecutamos el código nos sumara los dos valores por la consola:
Modificamos el interface y añadimos un nuevo método el programa no compilará ya que nos avisará de que no estamos apuntando a un Java Functional Interface , recordemos que estos únicamente disponen de un método abstracto.
Para evitar este tipo de problemas se usa la anotación @FunctionalInterface que obliga al desarrollador a solo incluir un método abstracto.
package com.arquitecturajava.functional; public class Principal { @FunctionalInterface interface Matematicas { public double operacion(double x, double y); } public static void main(String[] args) { Matematicas o = (x, y) -> x + y; System.out.println(o.operacion(2, 3)); } }
De esta forma cometeremos menos errores. Este es en resumen el concepto de Java Functional Interface.
Otros artículos relacionados: Java Lambda , Java Lambda Reduce ,Java Lambda WorkFlows
Hola,
solo añadir que también se considera una Interfaz Funcional aquellas Interfaces que tengan varios métodos pero que todos ellos menos uno sobreescriban los de Object.
gracias por el aporte
La interfaz también puede tener otros métodos que sean default:
@FunctionalInterface
interface Matematicas {
double operacion(double x, double y);
default double calculaCuadrado(double x) {
return Math.sqrt(x);
}
}
Es verdad, las interfaces funcionales también pueden tener otros métodos default:
Ejemplo:
Interface
package com.robertramirezg.interfacedefault;
@FunctionalInterface
public interface ICalculadora {
int sumar(int x, int y);
default int multiplicar (int x, int y) {
return x*y;
}
}
Implementación
package com.robertramirezg.interfacedefault;
public class CalculadoraImpl {
public static void main(String[] args) {
ICalculadora calculadora = (x,y) -> x + y;
System.out.println(calculadora.sumar(2, 1));
System.out.println(calculadora.multiplicar(1, 1));
}
}
Cecilio desde que leí tu libro, empecé a seguir tu blog y la verdad que es muy bueno, solo me gustaría agregar que el paquete java.util.function cuenta con interfaces funcionales que nos ayudan a igualar a expresiones lambda como es el caso de Consumer, Supplier, Function etc
Muchas Gracias , tengo pendiente hablar de ellos 🙂
Desde móvil el aviso de cookies ocupa media pantalla y no se puede quitar
Prácticamente no se puede leer esta web desde un móvil
Anda no lo sabía 🙁 lo revisare , muchas gracias
Que móvil tienes , a mí desde el mío no me ocurre :??