¿Por qué las expresiones lambda son objetos en Java? [duplicar]

Nov 06 2020

¿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

2 JakubZnamenáček Nov 06 2020 at 19:17

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");
        });
}
1 m0skit0 Nov 06 2020 at 17:50

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.

Coder Nov 06 2020 at 19:04

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)