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.

  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.

  * * @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 Introduzca aquí la descripción de la imagen

  • Android y Lambda
  • Las expresiones Lambda se bloquean con IncompatibleClassChangeError en Android cuando se usa jack
  • No se puede usar forEach y lambda en android min sdk versión menos de 24
  • Retrolambda $ Lambda no encontrado
  • Unidad Método de prueba que no contiene lambda expresión Android Studio
  • NoSuchMethodError con Android Lambdas
  • Android Studio: lambda no funciona
  • Expresiones Lambda en android
  • Kotlin: safe lambdas (no hay fugas de memoria)?
  • Filtra una lista de objetos en Android usando gradle-retrolambda y Lightweight-Stream-API
  • ¿Cómo mejorar la sintaxis kotlin lambda?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.