Bene, ci sono principalmente due differenze. Il primo è collegato al processo sottostante in corso in Javac e JVM e il secondo è la sintassi.
Prima di dare una spiegazione, consente di definire molto rapidamente cos'è una chiusura nel linguaggio funzionale "reale": una funzione che si accompagna al suo ambiente lessicale e al contesto di memoria.
Inizialmente, il compilatore risolverà questo codice "scandendo" il "contesto syntaxiq" in cui verrà eseguito il codice (non le variabili, ma il codice che scrivi causa il controllo statico del compilatore). Se rileva che stai scrivendo una lambda come parametro di un metodo che è in attesa di un'interfaccia funzionale, sarai in grado di compilare in modo che la JVM sia in grado di trovare la giusta pace di codice da eseguire. Di fatto implementerai un'interfaccia che espone solo una firma al volo.
Poi, la sintassi di per sé è importante perche 'non vi darà lo stesso potere di una classe anonima, dove sarà in grado di implementare o sostituire diversi metodi nello stesso luogo.
Il pezzo di codice nella domanda non è molto pertinente per vedere la differenza tra i due concetti e non sta usando "chiusura" nel suo intero. Ecco un pezzo di codice che potrebbe aiutare te vedere il potenziale:
public class MyClass
{
// A one method interface.
public static interface Function
{
void execute(int a);
};
// An implementation of Function using the closure and lambda.
public static Function createPrintAddToTenFunction()
{
Integer x = 10;
Function func = (a) -> System.out.println(x + a);
return func;
}
// A basic program.
public static void main(String args[])
{
Function func = createPrintAddToTenFunction();
func.execute(10);
}
}
Questa compilazione in Java 8 e stamperà: 20
Ma, c'è qualcosa di strano in Java con chiusura. Questo pezzo di codice viene dalla online documentation, 14:
public static void main(String... args) {
StringBuilder message = new StringBuilder();
Runnable r =() -> System.out.println(message);
message.append("Howdy, ");
message.append("world!");
r.run();
}
questo stampa Howdy, world!
E questo è proprio quello che non si vuole in un linguaggio di programmazione funzionale. La JVM fa questo perché Java è un linguaggio orientato agli oggetti ed è piuttosto bravo a farlo.
In Java si utilizzano molti riferimenti all'heap (che sono vicini ai puntatori in una lingua come C o C++ ancora più vicino). Con questo principio, è possibile modificare una variabile avviata nel contesto della memoria del programma se si è incorporato un riferimento ad esso nella pila di esecuzione. Questo è il principio implicito proveniente dallo Von Neumann Architecture. Questo differisce da un linguaggio funzionale che dovrebbe racchiudere tra loro contesti di esecuzione diversi, che è sottilmente diverso e ti garantirà che un valore riferito da una variabile non verrà modificato da un successivo assegnamento della variabile. Ma questa è un'altra storia.
È ancora un'istanza di una classe anonima. E no, non è più potente. – newacct