¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?
A diferencia de las clases internas anónimas, las lambdas de Java 8 no contienen referencias a la clase enclosing (parent). Android N agrega soporte para lambdas.
Sin embargo, se implementan en el compilador Jack
utilizando clases internas anónimas para compatibilidad con versiones anteriores, como indica la nota en el enlace.
- Android y Lambda
- Las expresiones Lambda se bloquean con IncompatibleClassChangeError en Android cuando se usa jack
- Android Studio: lambda no funciona
- ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
- No se puede refactorizar métodos con subrayado como un parámetro en lambdas?
¿Significa esto que las lambdas en las clases de Android compiladas usando Jack (y no retrolambda) contendrán referencias a la clase inclusiva?
Sé que una razón por la que mucha gente estaba entusiasmada con lambdas es evitar fugas de Fragment
o Activity
al usarlas, pero a primera vista, parece que usar el compilador jack
no dará ese beneficio.
- Expresiones Lambda en android
- Filtra una lista de objetos en Android usando gradle-retrolambda y Lightweight-Stream-API
- Java 8 Stream API en Android N
- Java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
- No se puede usar forEach y lambda en android min sdk versión menos de 24
One Solution collect form web for “¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?”
Creo que la frase "clase anónima" no debe interpretarse demasiado literalmente aquí. En mi entendimiento, lo único que quieren decirnos es que Jack genera las clases en tiempo de compilación (en contraposición al enfoque de tiempo de ejecución de Java 8).
Del código de JackIrBuilder adivinaría que el IR generado parece muy similar al bytecode que sería generado por retrolambda.
Jack parece crear un método sintético que contiene el cuerpo lambda en el tipo de inclusión y pasa la referencia de la instancia de inclusión al constructor de la clase generada sólo en aquellos casos en los que es necesario, es decir, cuando se capturan los miembros de la instancia de inclusión.
Por lo tanto, por lo que entiendo, la respuesta es: sólo cuando algo tiene que ser capturado de la instancia de inclusión.
- ¿Java 8 funciona en Android api 24 y superior ¿O puede utilizar en api menor?
- Kotlin: safe lambdas (no hay fugas de memoria)?
- Unidad Método de prueba que no contiene lambda expresión Android Studio
- Uso de expresiones lambda con interfaces no funcionales en Java
- El método stream () no funciona en android
- NoClassDefFoundError cuando uso lambda para recorrer String array
- ¿Cómo mejorar la sintaxis kotlin lambda?
- ¿Está Android N Stream API backported a versiones inferiores?
- Android studio: las expresiones lambda no son compatibles en -source 1.7 (use -source 8 o superior para permitir expresiones lambda)
- NoSuchMethodError con Android Lambdas
- Androide retrolambda, la sentencia lambda puede ser reemplazada por la expresión 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