Come mai le espressioni lambda sono oggetti in Java? [duplicare]

Nov 06 2020

Come sono gli oggetti delle espressioni lambda in Java? Come possono le espressioni lambda, che fanno parte della programmazione funzionale, essere implementate in Java, che è un linguaggio orientato agli oggetti? Di quali concetti Java ho bisogno per comprendere le espressioni lambda?

Risposte

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

Devi capire poche cose:

1) Interfaccia funzionale

  • interfaccia che ha un solo metodo pubblico
public interface Runnable{
    void run();
}
  • questo è un esempio di interfaccia funzionale, può avere diversi tipi di metodi come int processNumber(int number)
  • ricorda solo che può esserci un solo metodo (un metodo non implementato, i valori predefiniti non contano)

2) Utilizzando l'interfaccia funzionale

  • puoi implementare la tua interfaccia funzionale nella tua classe diciamo MyRunnable
public class MyRunnable implements Runnable{
    public void run(){
        System.out.println("Hello world");
    }
}
  • di quanto tu possa passare la tua classe MyRunnable in un altro metodo è solo un oggetto normale
public class MyClass{
    public void myMethod(Runnable runnable){
        runnable.run();
    }
}
  • questo stamperebbe "Hello world"
public static void main{
    MyClass myClass = new MyClass();
    myClass.myMethod(new MyRunnable());
}

3) Cosa sta facendo lambda

  • quindi ciò che lambda ti consente di fare è creare un'implementazione anonima dell'interfaccia
public static void main{
    MyClass myClass = new MyClass();
    myClass.myMethod(() -> System.out.println("Hello my world"));
}
  • questo stamperebbe "Hello my world"
  • stai solo creando un'implementazione anonima di Runnable e passandola a MyMethod
  • è solo zucchero sintattico per questo
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

Un lambda in Java è fondamentalmente solo un'interfaccia funzionale . È principalmente zucchero sintattico .

Java non è un linguaggio funzionale e come tale non può implementare completamente la programmazione funzionale, ma solo un sottoinsieme dei suoi principi fondamentali. Ad esempio, non è possibile implementare classi di tipi appropriate in Java .

In ogni caso non esiste una definizione standard per FP, così come non esiste una definizione standard per OOP. La definizione specifica può variare a seconda delle fonti, ma le idee generali sono (di solito) le stesse.

Coder Nov 06 2020 at 19:04

Java è un linguaggio orientato agli oggetti. Ma alcune funzionalità dei linguaggi funzionali sono disponibili anche in Java come lambda

lambda è fondamentalmente un oggetto che agisce come una funzione. documentazione :https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

come al solito una funzione ha un input e un output

input nelle funzioni: indicato come T (come in take)

uscite in funzione: indicate come R (come in ritorno)

struttura della dichiarazione: Function<T,R> var_name = input_variables -> output_expression

esempio : Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));

o c'è un altro modo (noto anche come riferimento al metodo)

questo è in realtà l'accesso al metodo sotto il cofano

Function<T,R> var_name = class_name :: method_name

esempio : Function<Double,Double>Tanh = Math::tanh

Utilizzando una funzione

Per utilizzare una funzione è sufficiente chiamare il apply(T t)metodo della classe della funzione

esempio : double num = sigmoid.apply(0)