Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • Android y Lambda
  • Android Studio: lambda no funciona
  • ¿Los lambdas en el compilador de lazo de Android N tienen referencias a la clase de inclusión?
  • Android studio: las expresiones lambda no son compatibles en -source 1.7 (use -source 8 o superior para permitir expresiones lambda)
  • ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
  • Java 8 Stream API en Android 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
  • ¿Java 8 funciona en Android api 24 y superior ¿O puede utilizar en api menor?
  • 5 Solutions collect form web for “NoClassDefFoundError cuando uso lambda para recorrer String array”

      * * @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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.