I riferimenti al metodo ignorano l'overhead del wrapper lambda? Potrebbero in futuro?
In base al tutorial Java sui riferimenti al metodo :
Sometimes... a lambda expression does nothing but call an existing method. In those cases, it's often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.
Preferisco la sintassi lambda alla sintassi del metodo di riferimento per diversi motivi:
Lambdas è più chiaro
Nonostante le affermazioni di Oracle, trovo la sintassi lambda più facile da leggere rispetto al riferimento al metodo oggetto short-hand perché la sintassi del riferimento al metodo è ambigua:
Bar::foo
Stai chiamando un metodo statico a un argomento sulla classe di x e passandolo a x?
x -> Bar.foo(x)
O stai chiamando un metodo di istanza con argomento zero su x?
x -> x.foo()
La sintassi del riferimento al metodo potrebbe sostituire uno dei due. Nasconde ciò che il tuo codice sta effettivamente facendo.
Lambdas è più sicuro
Se fai riferimento a Bar :: pippo come metodo di classe e Bar aggiunge in seguito un metodo di istanza con lo stesso nome (o viceversa), il tuo codice non verrà più compilato.
Puoi usare lambdas in modo coerente
Puoi racchiudere qualsiasi funzione in una lambda, così puoi usare la stessa sintassi in modo coerente ovunque. La sintassi del riferimento al metodo non funzionerà su metodi che accettano o restituiscono matrici primitive, eseguono eccezioni controllate o hanno lo stesso nome di metodo utilizzato come un'istanza e un metodo statico (poiché la sintassi del riferimento al metodo è ambigua riguardo al metodo da chiamare) . Non funzionano quando hai sovraccaricato i metodi 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 è prevista alcuna penalizzazione delle prestazioni, sono tentato di disattivare l'avviso nel mio IDE e utilizzare la sintassi lambda in modo coerente senza sprecare il riferimento al metodo occasionale nel mio codice.
P.S.
Né qui né là, ma nei miei sogni, i riferimenti al metodo degli oggetti sono più simili a questo e applicano invoke-dynamic al metodo direttamente sull'oggetto senza un wrapper lambda:
_.foo()