Come mai le espressioni lambda sono oggetti in Java? [duplicare]
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
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");
});
}
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.
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)