As referências de método ignoram a sobrecarga do wrapper lambda? Eles podem no futuro?
De acordo com o Tutorial Java sobre referências de método :
Às vezes ... uma expressão lambda não faz nada além de chamar um método existente. Nesses casos, geralmente é mais claro fazer referência ao método existente por nome. As referências de método permitem que você faça isso; elas são expressões lambda compactas e fáceis de ler para métodos que já possuem um nome.
Prefiro a sintaxe lambda à sintaxe de referência do método por vários motivos:
Lambdas são mais claras
Apesar das alegações da Oracle, acho a sintaxe lambda mais fácil de ler do que a referência de método de objeto em abreviação, porque a sintaxe de referência de método é ambígua:
Bar::foo
Você está chamando um método estático de um argumento na classe de x e passando x?
x -> Bar.foo(x)
Ou você está chamando um método de instância de argumento zero em x?
x -> x.foo()
A sintaxe de referência do método pode substituir qualquer um. Ele oculta o que seu código está realmente fazendo.
Lambdas são mais seguras
Se você referenciar Bar :: foo como um método de classe e Bar posteriormente adicionar um método de instância com o mesmo nome (ou vice-versa), seu código não será mais compilado.
Você pode usar lambdas consistentemente
Você pode agrupar qualquer função em uma lambda - para poder usar a mesma sintaxe de maneira consistente em todos os lugares. A sintaxe de referência do método não funciona em métodos que recebem ou retornam matrizes primitivas, lançam exceções verificadas ou têm o mesmo nome de método usado como uma instância e um método estático (porque a sintaxe de referência do método é ambígua sobre qual método seria chamado) . Eles não funcionam quando você sobrecarregou métodos com o mesmo número de argumentos, mas você não deve fazer isso de qualquer maneira (consulte o item 41 de Josh Bloch), para que não possamos impedir isso de fazer referência a métodos.
Conclusão
Se não houver penalidade de desempenho por fazer isso, sou tentado a desativar o aviso no meu IDE e usar a sintaxe lambda de forma consistente, sem borrifar a referência ocasional do método no meu código.
PS
Nem aqui nem ali, mas nos meus sonhos, as referências de método de objeto se parecem mais com isso e aplicam invoke-dynamic contra o método diretamente no objeto sem um wrapper lambda:
_.foo()
.map(_.acceptValue())
: Se não me engano, isso se parece muito com a sintaxe do Scala. Talvez você esteja apenas tentando usar o idioma errado.
System.out::println
a forEach()
todo o tempo ...?