NoClassDefFoundError cuando uso lambda para recorrer String array
Conseguí el error de seguimiento cuando utilizo lambda para recorrer la serie de la secuencia.
java.lang.NoClassDefFoundError: com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity$$Lambda$1 at com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity.initView(CreateOrUpdateAlarmActivity.java:143) at com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity.onCreate(CreateOrUpdateAlarmActivity.java:73)
Éste es mi código. Sé que es aceptable para la manera tradicional de recorrer el arsenal de la secuencia, pero porqué sucede esto cuando utilizo lambda.
- ¿Java 8 funciona en Android api 24 y superior ¿O puede utilizar en api menor?
- ¿Hay alguna manera de utilizar interfaces funcionales Java 8 en la API de Android por debajo de 24?
- Aplicación de Android + Módulo de Java (Java 1.8)
- Kotlin, Proguard y lambdas
- Android studio: las expresiones lambda no son compatibles en -source 1.7 (use -source 8 o superior para permitir expresiones lambda)
String[] days = dayOfWeek.split(","); Arrays.asList(days).forEach(day->{ int index = Integer.valueOf(day) -1; checkBoxList.get(index).setChecked(true); });//where happens NoClassDefFoundError
Mi archivo build.gradle
android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.twsz.app.ivybox" minSdkVersion 14 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dataBinding { enabled = true } }
Gracias por cualquier ayuda.
- ¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?
- 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
- El método stream () no funciona en android
- No se puede refactorizar métodos con subrayado como un parámetro en lambdas?
- Java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
- Uso de expresiones lambda con interfaces no funcionales en Java
- Java 8 Stream API en Android N
- ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
* * @param action The action to be performed for each element * @throws NullPointerException if the specified action is null * @since 1.8 */ default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
ForEach es el método predeterminado, sólo es compatible con java8.
Android no admite todas las características del lenguaje Java 8. Sin embargo, las siguientes características están disponibles al desarrollar aplicaciones orientadas a Android 7.0 (API nivel 24):
Métodos de interfaz predeterminados y estáticos
Las expresiones Lambda (también disponibles en el API nivel 23 e inferior)
Referencias repetibles Método Referencias (también disponible en API nivel 23 e inferior)
Anotaciones de tipo (también disponible en API nivel 23 e inferior)
Soporte de Android por defecto y métodos de interfaz estática, pero necesita nivel API 24.Más detalles aquí
defaultConfig { applicationId "com.twsz.app.ivybox" minSdkVersion 14 // Your minSdkVersion is less than 24 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true }
Cuando ejecute su aplicación en el sistema menos de 24, obtendrá esa excepción. Así que es mejor que cambies de otra manera. Bucle tradicional o Rxjava2.
forEach
solo está disponible en Android N, no se puede utilizar ninguna API desde Java 8 antes de SDK 24.
Incluso si usted está usando Retrolambda o Jack.
Necesita usar loop regular.
Según Android, si desea utilizar lambdas, debe configurar su API de targe a algo inferior a 23 (la suya está actualmente establecida en 25) y luego utilizar la cadena Jacktool.
Por los documentos :
Android no admite todas las características del lenguaje Java 8. Sin embargo, las siguientes características están disponibles al desarrollar aplicaciones orientadas a Android 7.0 (API nivel 24):
- Métodos de interfaz predeterminados y estáticos
- Las expresiones Lambda (también disponibles en el API nivel 23 e inferior)
- Anotaciones repetibles
- Referencias de métodos (también disponible en el API nivel 23 e inferior)
- Anotaciones de tipo (también disponible en API nivel 23 e inferior)
Nota : Nota: La información de anotación de tipo está disponible en tiempo de compilación, pero no en tiempo de ejecución. Además, la plataforma soporta TYPE en API 24 y siguientes, pero no ElementType.TYPE_USE o ElementType.TYPE_PARAMETER ..
Para probar expresiones lambda, referencias a métodos y anotaciones de tipos en versiones anteriores de Android, vaya a su archivo build.gradle y establezca compileSdkVersion y targetSdkVersion a 23 o menos. Deberá habilitar la cadena de herramientas Jack para usar estas características de Java 8.
Para utilizar las funciones de Java 8, debe habilitar Jack Toolchain
defaultConfig { ... jackOptions { enabled true } }
Consulte la documentación para obtener más información
Fuente: https://developer.android.com/guide/platform/j8-jack.html
Si quieres usar lambda en android, agregas a la opción gradle como esta
- ¿Cómo enlazar activos de android a escritorio en libgdx?
- Dos aplicaciones de Android con el mismo ID de usuario