¿Las referencias a métodos omiten la sobrecarga del contenedor 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 su nombre. Las referencias de métodos le permiten hacer esto; son expresiones lambda compactas y 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, encuentro que la sintaxis lambda es más fácil de leer que la referencia breve al método de objeto porque la sintaxis de referencia del método es ambigua:
Bar::foo
¿Está llamando a un método estático de un argumento en la clase de x y pasándole x?
x -> Bar.foo(x)
¿O estás llamando a un método de instancia de argumento cero en x?
x -> x.foo()
La sintaxis de referencia del método podría sustituir a cualquiera de los dos. Oculta lo que su código está haciendo realmente.
Las lambdas son más seguras
Si hace referencia a Bar :: foo como un 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 constantemente
Puede ajustar cualquier función en un lambda, por lo que puede usar la misma sintaxis de manera consistente en todas partes. La sintaxis de referencia del 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 utilizado como una instancia y un método estático (porque la sintaxis de referencia del método es ambigua sobre qué método se llamaría) . No funcionan cuando ha sobrecargado los métodos con el mismo número de argumentos, pero no debe hacerlo de todos modos (consulte el artículo 41 de Josh Bloch), por lo que no podemos compararlo con las referencias de métodos.
Conclusión
Si no hay una penalización de rendimiento por hacerlo, estoy tentado a desactivar la advertencia en mi IDE y usar la sintaxis lambda de manera consistente sin rociar la referencia de método ocasional en mi código.
PD
Ni aquí ni allá, pero en mis sueños, las referencias a 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()
.map(_.acceptValue())
: Si no me equivoco, esto se parece mucho a la sintaxis de Scala. Tal vez solo estás tratando de usar el lenguaje incorrecto.
System.out::println
a forEach()
todo el tiempo ...?