2015-02-19 12 views
5

Ho due variabili come segue:Qual è il vantaggio di utilizzare i riferimenti al metodo in questo caso?

List<Basket> bigBasket = new ArrayList<>(); Basket basket = new Basket();

ho scritto il seguente codice per aggiungere una relazione tra gli elementi in bigBasket e basket:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) { 
    for (Fruit fruit : basket.getFruitInBasket()) { 
     specialFruit.addRelationship(fruit); 
    } 
} 

Ora questo è tutto bene, ma IntelliJ ispezionato il codice e offerto di migliorarlo con l'utilizzo di un riferimento al metodo, così ho ottenuto il seguente:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) { 
    basket.getFruitInBasket().forEach(specialFruit::addRelationship); 
} 

Quindi quanto sopra ha meno linee ma qual è il reale vantaggio di ciò? Non sono completamente informato sui vantaggi delle funzionalità di Java 8, quindi probabilmente è questo il motivo per cui non capisco davvero cosa sta succedendo.

A mio parere, la versione "migliorata" del codice non è molto leggibile nel senso di comprendere immediatamente ciò che sta accadendo rispetto a uno standard per ciclo assumendo che non si abbia molta conoscenza delle funzionalità di Java 8.

Qualcuno potrebbe spiegare i vantaggi del codice "migliorato" rispetto allo standard per ciclo?

MODIFICA: rimossi riferimenti errati a lambda. Il codice usa solo riferimenti di metodo - solo un errore di gergo da parte mia!

+1

Forse è solo il riferimento al metodo che non sembra intuitivo? Che ne dici di 'bigBasket.get (0) .getFruitInBasket(). ForEach (specialFruit -> basket.getFruitInBasket(). ForEach (fruit -> specialFruit.addRelationship (fruit)))? – Holger

+2

Certamente un idioma non può essere letto da una persona che non ha familiarità con esso, ma questo è solo un truismo. Il punto veramente rilevante è questo: quale è più leggibile per una persona che abbia ugualmente familiarità con * entrambi * gli idiomi? Per me, il costrutto 'forEach' è molto più semplice perché ci sono meno cose da controllare per essere sicuri di cosa sia lo snippet. –

risposta

6

Non vedo alcun vantaggio nel codice "migliorato" in termini di prestazioni. Entrambi gli snippet eseguono l'iterazione sull'intera collezione basket.getFruitInBasket() ed eseguono esattamente la stessa azione per ciascun elemento.

Preferire una via all'altra è semplicemente una questione di gusti. A mio parere, la versione Java 8 esprime il fatto che si esegue una singola azione su tutti gli elementi della Raccolta in modo più chiaro (assumendo che si sia abituati ai riferimenti al metodo).

BTW, non c'è espressione lambda nel codice, solo un riferimento al metodo.

Problemi correlati