No se puede refactorizar métodos con subrayado como un parámetro en lambdas?
Tengo un montón de clases con un método (la mitad de ellos no utilizan su parámetro y por lo tanto el nombre de subrayado), y acabo de cambiar a Java 8. Ahora quiero reemplazarlos por lambdas.
Aquí está mi código:
- Androide retrolambda, la sentencia lambda puede ser reemplazada por la expresión lambda
- ¿Cómo mejorar la sintaxis kotlin lambda?
- Android Jack: Lambda que viene del archivo jar necesita sus interfaces en el classpath para ser compilado, las interfaces desconocidas son java.util.function.Consumer
- Unidad Método de prueba que no contiene lambda expresión Android Studio
- ¿Java 8 funciona en Android api 24 y superior ¿O puede utilizar en api menor?
interface I { void stuffHappened(Integer howManyStuff); } public class A { void go() { I i = new I() { public void stuffHappened(Integer _) { System.out.println("woah!!"); } }; } }
Y después:
interface I { void stuffHappened(Integer howManyStuff); } public class A { void go() { I i = _ -> System.out.println("woah!!"); } }
Como puede ver, al parecer ya no es válido, alegando el uso de "_" como el nombre del parámetro ya no es válido. Pero entonces, ¿por qué permitió este refactor en primer lugar? ¿Y por qué funciona con clases anónimas, pero no lambdas? ¿Es esto realmente una nueva regla? ¿O es algún tipo de discrepancia en IDEA?
Estoy usando Intellij-IDEA (la primera vez que lo uso), bueno en realidad, Android Studio (Beta) 0.8.1 (utilizando retrolambda para permitir lambdas en android), que creo que utiliza IDEA.
- Las expresiones Lambda se bloquean con IncompatibleClassChangeError en Android cuando se usa jack
- Android y Lambda
- ¿Está Android N Stream API backported a versiones inferiores?
- Java 8 Stream API en Android N
- Expresiones Lambda en android
- Android Studio: lambda no funciona
- Aplicación de Android + Módulo de Java (Java 1.8)
- NoClassDefFoundError cuando uso lambda para recorrer String array
Lambdas no permiten _
como un nombre de parámetro, pero lo hacen las construcciones existentes.
De JLS 15.27.1. Lambda Parámetros :
Es un error en tiempo de compilación si un parámetro lambda tiene el nombre _ (es decir, un solo carácter de subrayado).
Se desaconseja el uso del nombre de la variable _ en cualquier contexto. Las versiones futuras del lenguaje de programación Java pueden reservar este nombre como una palabra clave y / o darle semántica especial.
Yo sugeriría renombrar los parámetros a __
, $
, o para ahorrar espacio, ya que ya está usando unicode, _
(aunque quizás este último es un abuso lingüístico – no sé para qué se destina ese punto de código real).
Antes de Java 8, un solo guión bajo _
era un identificador válido. A partir de Java 8, el subrayado no está permitido, para permitir la posibilidad futura de que sea algo distinto de un identificador ordinario. Vea este mensaje de Brian Goetz para la explicación.
El uso de un guión bajo en código existente (pre-lambda) generará una advertencia, pero el uso de un guión bajo como un nombre de parámetro formal lambda generará un error. Como dijo Brian, "ya que no existe un código con lambdas".
En su ejemplo, el parámetro formal _
en su clase interna anónima es el código legal, aunque debería generar una advertencia. ¡Refactorizar este código en un lambda que usa _
lo hará ilegal! Dado que IntelliJ IDEA está refactorizando este código, debe tener en cuenta esta regla, y debería ofrecer cambiar el nombre del parámetro a otra cosa.
Esto podría ser visto como un error, o al menos una necesidad de una mejora, en el mecanismo de refactorización de IDEA.