Generalmente non c'è differenza. NewClass::new
produce meno bytecode come nella versione lambda un metodo privato generato automaticamente viene creato dal compilatore java dal corpo lambda mentre NewClass:new
collega direttamente all'handle del metodo del costruttore. Quindi usando i riferimenti al metodo potresti avere una dimensione del file di classe leggermente inferiore. Non ci sono tuttavia significative differenze nelle prestazioni.
Un'altra differenza è la procedura di risoluzione del metodo. Non è applicabile nel tuo esempio particolare, ma potrebbe essere applicabile in altri codici. Ad esempio, si hanno due costruttori:
public NewClass(String a) {...}
public NewClass(String a, String b) {...}
E avere qualche metodo che accetta interfaccia funzionale:
public myMethod(Function<String, NewClass> fn) {...}
Poi si può chiamare sia con lambda o interfaccia funzionale:
myMethod(str -> new NewClass(str));
myMethod(NewClass::new);
Ma supponiamo che in seguito aggiungerai un nuovo metodo con lo stesso nome:
public myMethod(BiFunction<String, String, NewClass> fn) {...}
Quindi la chiamata di riferimento al metodo diventerà ambigua e comporterà un errore di compilazione come NewClass::new
ora corrisponde a entrambi i costruttori, mentre lambda è ancora univoco.
fonte
2015-08-01 17:19:42
Sembra che intendiamo 'elemento -> new NewClass (elemento)', giusto? –
Sì @TagirValeev spot on! – ShellDragon
Downvoters, ti dispiacerebbe spiegare perché? – ShellDragon