¿Las referencias de método omiten la sobrecarga de la envoltura lambda? ¿Podrían ellos en el futuro?
De acuerdo con el Tutorial de Java sobre referencias de métodos :
A veces ... una expresión lambda no hace más que llamar a un método existente. En esos casos, a menudo es más claro referirse al método existente por nombre. Las referencias de método le permiten hacer esto; son compactos, Expresiones lambda fáciles de leer para métodos que ya tienen un nombre.
Prefiero la sintaxis lambda a la sintaxis de referencia del método por varias razones:
Las Lambdas son más claras
A pesar de las afirmaciones de Oracle, me parece que la sintaxis lambda es más fácil de leer que la referencia del método del objeto, porque la sintaxis de la referencia del método es ambigua:
Bar::foo
¿Está llamando a un método estático de un solo argumento en la clase de x y lo está pasando x?
x -> Bar.foo(x)
¿O estás llamando a un método de instancia de cero argumentos en x?
x -> x.foo()
La sintaxis de referencia del método podría representar cualquiera de las dos. Oculta lo que realmente está haciendo tu código.
Las Lambdas son más seguras
Si hace referencia a Bar :: foo como método de clase y luego Bar agrega un método de instancia con el mismo nombre (o viceversa), su código ya no se compilará.
Puedes usar lambdas consistentemente
Puedes envolver cualquier función en un lambda, por lo que puedes usar la misma sintaxis de manera consistente en todas partes. La sintaxis de referencia de método no funcionará en los métodos que toman o devuelven matrices primitivas, lanzan excepciones verificadas, o tienen el mismo nombre de método usado como una instancia y un método estático (porque la sintaxis de referencia de método es ambigua sobre qué método se llamaría) . No funcionan cuando tienes métodos sobrecargados con la misma cantidad de argumentos, pero no debes hacerlo de todos modos (consulta el artículo 41 de Josh Bloch), por lo que no podemos compararlo con las referencias de los métodos.
Conclusión
Si no hay una penalización de rendimiento por hacerlo, estoy tentado de desactivar la advertencia en mi IDE y utilizar la sintaxis lambda de forma coherente sin agregar la referencia de método ocasional a mi código.
P.S.
Ni aquí ni allí, pero en mis sueños, las referencias de los métodos de objetos se parecen más a esto y aplican invoke-dynamic contra el método directamente en el objeto sin un contenedor lambda:
_.foo()