I riferimenti ai metodi saltano il sovraccarico del wrapper lambda? Potrebbero in futuro?
Secondo il tutorial Java sui riferimenti ai metodi :
A volte ... un'espressione lambda non fa altro che chiamare un metodo esistente. In questi casi, è spesso più chiaro fare riferimento al metodo esistente per nome. I riferimenti ai metodi ti consentono di farlo; sono espressioni lambda compatte e di facile lettura per i metodi che hanno già un nome.
Preferisco la sintassi lambda alla sintassi di riferimento del metodo per diversi motivi:
Le lambda sono più chiare
Nonostante le affermazioni di Oracle, trovo che la sintassi lambda sia più facile da leggere rispetto alla scorciatoia del riferimento al metodo dell'oggetto perché la sintassi del riferimento al metodo è ambigua:
Bar::foo
Stai chiamando un metodo statico a argomento singolo sulla classe di x e passando x?
x -> Bar.foo(x)
O stai chiamando un metodo di istanza zero-topic su x?
x -> x.foo()
La sintassi di riferimento del metodo potrebbe sostituire una delle due. Nasconde ciò che il tuo codice sta effettivamente facendo.
Le lambda sono più sicure
Se si fa riferimento a Bar :: foo come metodo di classe e Bar successivamente aggiunge un metodo di istanza con lo stesso nome (o viceversa), il codice non verrà più compilato.
Puoi usare lambda in modo coerente
Puoi racchiudere qualsiasi funzione in una lambda, in modo da poter utilizzare la stessa sintassi in modo coerente ovunque. La sintassi di riferimento del metodo non funziona sui metodi che accettano o restituiscono array primitivi, generano eccezioni verificate o hanno lo stesso nome di metodo usato come istanza e metodo statico (poiché la sintassi di riferimento del metodo è ambigua su quale metodo sarebbe chiamato) . Non funzionano quando hai metodi sovraccaricati con lo stesso numero di argomenti, ma non dovresti farlo comunque (vedi l'articolo 41 di Josh Bloch), quindi non possiamo tenerlo contro i riferimenti al metodo.
Conclusione
Se non ci sono penalità di prestazione per farlo, sono tentato di disattivare l'avviso nel mio IDE e utilizzare la sintassi lambda in modo coerente senza aggiungere il riferimento al metodo occasionale nel mio codice.
PS
Né qui né lì, ma nei miei sogni, i riferimenti al metodo dell'oggetto sembrano più simili a questo e applicano invoke-dynamic contro il metodo direttamente sull'oggetto senza un wrapper lambda:
_.foo()
.map(_.acceptValue())
: Se non sbaglio, assomiglia molto alla sintassi della Scala. Forse stai solo cercando di usare la lingua sbagliata.
System.out::println
per forEach()
tutto il tempo ...?