2015-11-03 3 views
7
Interface AccountService{ 
    public void createAccount(); 
} 

AccountService accountServiceAnonymous = new AccountService(){ 
    public void createAccount(){ 
     Account account = new Account(); 
     save(account); 
    } 
}; 

AccountService accountServiceLambda =() -> { 
    Account account = new Account(); 
    save(account); 
} 

Oltre al numero ridotto di righe di codice, esistono altri vantaggi dell'uso delle espressioni lambda in java 8?Quali sono i vantaggi dell'uso di espressioni lambda in java 8?

+3

codice cis, più leggibilità, meno cerimonie per fare cose semplici, sostituzione della classe anonima (devi ancora scrivere una classe anonima, in caso di lambda non devi scrivere una classe). Riutilizzo del codice, creare espressioni lambda e trasmetterle ai metodi. Ulteriore ulteriore introduzione di lambda ha permesso di abilitare il numero di cose buone in API come Stream che fornisce un'astrazione sull'iterazione. –

+1

Per l'uso di lambda e perché è stato introdotto leggere questo libro: Java 8 Lambdas di Richard Warburton –

+1

In breve: codice boilerplate inferiore = più manutenzione. –

risposta

11

In aggiunta a ciò che @Bilbo ha menzionato nei commenti. In Java 1.7 è stato rilasciato un nuovo Opcode JVM denominato invokedynamic e Java 8 Lambda lo utilizza. Quindi il seguente codice genererà una classe anonima che si crea quando si compila il codice. Possibile <ClassName>$1.class quindi se hai 10 classi anonimi ci sono altre 10 classi nel jar finale.

AccountService accountServiceAnonymous = new AccountService(){ 
    public void createAccount(){ 
     Account account = new Account(); 
     save(account); 
    } 
}; 

Ma Java 8 lambda usa invokedynamic chiamare lambda in tal modo, se si dispone di 10 lambda non comporterà alcun classi anonime riducendo così la dimensione finale vaso.

AccountService accountServiceLambda =() -> { 
    Account account = new Account(); 
    save(account); 
} 
+1

Ricordo [Venkat Subramaniam] (https://www.linkedin.com/in/vsubramaniam) parlando di questo in una delle sue conferenze. In quel video, ha anche detto che il suddetto pezzo di funzionalità non solo avvantaggia java ma anche i linguaggi tipizzati da jvm come Scala ecc., Molte grazie per aver segnalato! – harshavmb

2

Un altro vantaggio di lambda (e metodo riferimenti) è visibile quando si combinano con API Stream e altre funzioni aggiunte in Java 8, ad esempio Opzionale.

Considerate questo codice:

private void pushToFront(AbstractInfo contactInfo) { 
     registeredWindows.stream() 
      .filter(window -> window.getWindowId() == contactInfo.getId()) 
      .findAny() 
      .ifPresent(Window::pushToFront); 
    } 

Il metodo filtra l'elenco delle finestre registrati che corrispondono WindowID con id del contatto restituzione di un optional. Se la lista contiene una finestra con id corrispondente, allora il valore in Opzionale è presente e il metodo pushToFront è su di esso. Confronta questo per la stessa funzionalità, ma scritto in Java 7:

private void pushToFront(AbstractInfo contactInfo) { 
    for (Window window : registeredWindows) { 
     if (window.getWindowId() == contactInfo.getId() { 
      window.pushToFront(); 
     } 
    } 
} 

Il codice con l'espressione lambda, ruscello e metodo di riferimento, almeno per me, è più conciso e leggibile (quando si ottiene l'uso di utilizzare flussi). L'esempio sopra è abbastanza semplice, ma consideratene uno, che in Java 7 richiederebbe cicli annidati, più istruzioni condizionali, ecc. Non è facile leggere ancora più difficile per non perdere traccia di ciò che sta accadendo.

Lambdas consente quindi a uno di sfruttare appieno altre funzionalità nette di Java 8 che, tra l'altro, si traducono in codice pulito, pulito, efficiente e facile da capire.

Linea di fondo è, si dovrebbe prendere in considerazione le espressioni lambda come parte di un tutto più grande che sono grandi per se stessi, ma ancora meglio quando combinato con altri 'mattoni' di Java 8.

0

In aggiunta a quanto detto qui, e per rispondere rigorosamente alla domanda sollevata, è importante vedere lambda come un "blocco di codice" che, tra le altre cose, può essere passato come parametro. Ciò fornisce un enorme vantaggio grazie alla possibilità di rimuovere il codice duplicato.

Come è? Nell'esempio sopra presentato da @Kitke, il metodo (...) , se il requisito esiste, potrebbe essere refactored un po 'come modello e essere utilizzato per filtrare Windows registrati per qualsiasi condizione. L'espressione lambda window -> window.getWindowId() == contactInfo.getId(), può essere passata come parametro in questo caso. Senza questa potente funzione, è necessario scrivere il ciclo durante il ciclo ogni volta che è necessario filtrare la raccolta registrata di Windows in base a una condizione diversa. Guadagno enorme, ripensate il vostro codice con questo in mente.

Estratto da: http://www.copypasteisforword.com/notes/lambda-expressions-in-java.Qui puoi trovare un altro esempio di utilizzo di lambda per rimuovere il codice duplicato.

0

Vantaggio delle espressioni lambda 1. Riduce la riga di codice. 2. Supporta l'esecuzione sequenziale e parallela passando il comportamento nei metodi con l'API del flusso di raccolta. 3. Usando l'API Stream e l'espressione lambda possiamo ottenere una maggiore efficienza (esecuzione parallela) nel caso di operazioni bulk su collezioni.

1

Un altro - a differenza delle classi anonime, i lambda NON creano un nuovo ambito, condividono lo stesso ambito del blocco/ambiente che lo racchiude.

Quindi:

  1. E 'più facile per accedere all'oggetto racchiude - pianura this di riferimento si riferisce all'istanza della classe contenitrice (e non c'è bisogno di dire EnclosingClass.this)

  2. Ci sono no shadowing problemi (dato che non è possibile definire variabili locali con gli stessi nomi delle variabili nel campo di applicazione)