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:

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.

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.

  • Android Studio: lambda no funciona
  • ¿Está Android N Stream API backported a versiones inferiores?
  • Androide retrolambda, la sentencia lambda puede ser reemplazada por la expresión lambda
  • ¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?
  • ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
  • ¿Cómo mejorar la sintaxis kotlin lambda?
  • Kotlin, Proguard y lambdas
  • Expresiones Lambda en android
  • Android y Lambda
  • No se puede usar forEach y lambda en android min sdk versión menos de 24
  • Unidad Método de prueba que no contiene lambda expresión Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.