Attualmente sto passando attraverso Java Lambda e trovo anche chiamato Closures.Perché Java Lambda si chiama anche Closures
Per favore c'è un motivo per cui è anche chiamato Closures? Voglio una spiegazione tecnica.
Attualmente sto passando attraverso Java Lambda e trovo anche chiamato Closures.Perché Java Lambda si chiama anche Closures
Per favore c'è un motivo per cui è anche chiamato Closures? Voglio una spiegazione tecnica.
Questi sono due termini diversi che spesso vengono citati nello stesso contesto.
Un lambda è fondamentalmente solo una funzione anonima. Esempio: () -> System.out.println("Hello")
. È una funzione, ma non ha un nome.
A chiusura è un termine relativo allo scoping. Quando ad esempio, fa riferimento a una variabile locale all'interno di una lambda, come segue
int localInt = 17;
saveThisFunction(() -> System.out.println(localInt));
si crea una chiusura a catturalocalInt
all'interno del lambda. A livello di testo sembra ovvio che dovrebbe essere ok per accedere a localInt
all'interno della lambda, ma tieni presente che il lambda può essere memorizzato e chiamato molto tempo dopo che lo localInt
è stato estratto dalla pila.
Quindi, la creazione di un'espressione lambda richiede spesso la creazione di una chiusura (implicitamente).
semplicemente perché i termini sono equivalenti (penso sia come "funzione anonima") e questo è il modo in cui meccanismo simile viene chiamato in diverse lingue, ad es. Groovy ha chiusure
btw, non credo che questo è bordo diritto di porre queste domande
Tecnicamente è sbagliato, le espressioni lambda e le chiusure sono due cose leggermente diverse.
Lambda sono funzioni anonime, che nel mondo Java assumono la forma di classi unico metodo anonimo (vedi anche functional interfaces):
Runnable r1 =() -> System.out.println("I'm Runnable");
chiusure sono uno specifico sottotipo di espressioni lambda dove le variabili locali sono state associate a variabili definite in un ambiente di chiusura specifico.
Nel mondo Java, si sta solo scrivendo qualcosa di simile a questo esempio da here:
final int x = 99;
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x);
System.out.println("y = " + y);
};
Per una definizione astratta più completa di chiusure:
Operativamente, una chiusura è un dato struttura che memorizza una funzione insieme ad un ambiente: una mappatura che associa ogni variabile libera della funzione (variabili utilizzate localmente, ma definite in un ambito che racchiude lo) con il valore o lo spazio di memorizzazione il nome era legato al momento in cui è stata creata la chiusura.
Una chiusura, a differenza di una semplice funzione, consente alla funzione di accedere a tali variabili acquisite tramite il riferimento della chiusura ad esse, anche quando la funzione è invocata al di fuori del proprio ambito.
E che l'ultima parte significa che si può fare questo:
public class Funct{
public static Consumer<Integer> getThatClosure(){
final int x = 99;
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x);
System.out.println("y = " + y);
};
return myConsumer;
}
public static void main(String... args){
Consumer<Integer> cons=getThatClosure();
cons.accept(0);
}
}
Con questa uscita:
x=99
y=0
Prova la prossima volta di utilizzare la funzione di ricerca http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda – SubOptimal