NoClassDefFoundError when i use lambda to traverse String array

2022-09-03 04:18:01

当我使用lambda遍历字符串数组时,我得到了跟随错误。

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)

这是我的代码。我知道传统的方式遍历字符串数组是可以的,但是为什么当我使用lambda时会发生这种情况。

    String[] days = dayOfWeek.split(",");
    Arrays.asList(days).forEach(day->{
        int index = Integer.valueOf(day) -1;
        checkBoxList.get(index).setChecked(true);
    });//where happens NoClassDefFoundError

我的 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
        }
    }

感谢您的任何帮助。


答案 1
     *
     * @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是默认方法,它只受java8支持。

Android 不支持所有 Java 8 语言功能。但是,在开发面向 Android 7.0(API 级别 24)的应用时,可以使用以下功能:

默认和静态接口方法
Lambda 表达式(在 API 级别 23 及更低级别上也可用)
可重复注释 方法引用(在 API 级别 23 及更低级别上也可用)
类型注释(在 API 级别 23 及更低级别上也可用)

Android支持默认和静态接口方法,但它需要API级别24.更多细节在这里

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
        }

当你在少于 24 的系统运行应用时,你将收到该异常。所以你最好改变另一种方式。传统循环或 Rxjava2。


答案 2

forEach方法仅在 Android N 中可用,在 SDK 24 之前,您无法使用 Java 8 中的任何 API。

即使你使用的是 Retrolambda 或 Jack。

您需要使用常规 for 循环。


推荐