2015-03-17 17 views
9

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.

+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

risposta

15

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).

-1

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

2

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.

Source

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 
Problemi correlati