¿Por qué las expresiones lambda son objetos en Java? [duplicar]
¿Cómo son los objetos de expresiones lambda en Java? ¿Cómo se pueden implementar las expresiones lambda, que son parte de la programación funcional, en Java, que es un lenguaje orientado a objetos? ¿Qué conceptos de Java necesito para comprender las expresiones lambda?
Respuestas
Necesitas entender algunas cosas:
1) interfaz funcional
- interfaz que tiene un solo método público
public interface Runnable{
void run();
}
- este es un ejemplo de interfaz funcional, puede tener diferentes tipos de métodos como int
processNumber(int number) - solo recuerde que solo puede haber un método (un método no implementado, los valores predeterminados no cuentan)
2) Usando interfaz funcional
- puede implementar su interfaz funcional en su clase, digamos MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- de lo que puede pasar su clase MyRunnable en otros métodos, es solo un objeto normal
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- esto imprimiría "Hola mundo"
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) Qué está haciendo lambda
- así que lo que lambda le permite hacer es crear una implementación anónima de la interfaz
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- esto imprimiría "Hola mi mundo"
- solo está creando una implementación anónima de Runnable y pasándola a MyMethod
- es solo azúcar sintáctico para esto
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Una lambda en Java es básicamente una interfaz funcional . Es principalmente azúcar sintáctico .
Java no es un lenguaje funcional y, como tal, no puede implementar completamente la programación funcional, solo un subconjunto de sus principios básicos. Por ejemplo, no puede implementar clases de tipos adecuadas en Java .
En cualquier caso, no existe una definición estándar para FP, al igual que no existe una definición estándar para OOP. La definición específica puede variar según las fuentes, pero las ideas generales son (generalmente) las mismas.
Java es un lenguaje orientado a objetos. Pero algunas características de lenguajes funcionales también están disponibles en java como lambda
lambda es básicamente un objeto que actúa como una función. documentación:https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
como de costumbre, una función tiene una entrada y una salida
Entradas en funciones: referidas como T (como en take)
salidas en función: referido como R (como en retorno)
estructura de declaración: Function<T,R> var_name = input_variables -> output_expression
ejemplo: Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
o hay otra forma (también conocida como referencia de método)
esto en realidad es acceder al método bajo el capó
Function<T,R> var_name = class_name :: method_name
ejemplo: Function<Double,Double>Tanh = Math::tanh
Usando una función
Para usar una función, solo necesita llamar al apply(T t)método de la clase de función
ejemplo: double num = sigmoid.apply(0)