【问题标题】:Cannot use lambda functions in Android with Java 1.8无法在带有 Java 1.8 的 Android 中使用 lambda 函数
【发布时间】:2017-06-03 19:06:03
【问题描述】:

我正在使用的库是bychan,我什至不能将它包含在作为模块或通过 jar 加载的 Nougat 空应用项目中。

以下是 Android Studio 消息中返回的示例:

有人能解释一下下面错误中“未知接口”的含义吗?

Error:TokenDefinitionBuilder.java:118-119: Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Function
Error:TokenDefinitionBuilder.java:118-119: Lambda coming from jar file need their interfaces on the classpath to be compiled, unknown interfaces are java.util.function.Predicate
...
Error:com.android.jack.JackAbortException

这来自我使用过的一个库。我认为在尖括号中添加类型会有所帮助吗?我不知道它是否有任何作用。

这是该库中的第 118-119 行:

strings.stream().<StringMatcher>map(StringMatcher::new).map(
    m -> m.tryMatch(input, searchStart)).filter(Objects::nonNull).findFirst().orElse(null));

我不确定它在抱怨什么?我应该怎么做或改变来避免这个问题? 我原以为安卓可能不支持 Lambda 表达式,但错误中明确指出“Lambda 来自...”,这意味着它识别出我使用了 lambda 表达式。

请帮忙。


更新

如果有帮助,我已通过将其编译到另一个 jar 库中的 jar 中来包含该库。如果你不知道,我是 Android 世界的新手。

更新 2

我认为这与 API 版本无关?我已将构建目标设置为 25。但构建仍然失败。

另外,如果您看下面,我没有看到 1.8 的选项?但是我已将构建 JDK 设置为我的 1.8 JDK 位置


分级

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "this.is.where.i.have.my.id"
        minSdkVersion 25
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.android.support:support-v4:25.0.0'
    compile 'com.android.support:design:25.0.0'
    compile 'com.android.support:preference-v7:25.0.0'
    compile 'com.android.support:preference-v14:25.0.0'
    compile 'com.google.android.gms:play-services-appindexing:9.8.0'
    testCompile 'junit:junit:4.12'
    compile 'com.google.code.gson:gson:2.8.0'
    compile files('libs/my_lib_that_contains_lambda.jar')
}

【问题讨论】:

  • 您的目标 Android API 级别是什么。应该支持API Level 23
  • @PeterMmm 等等,我还有 21 分钟。让我尝试更新它。我只检查了 API 级别 24 支持 java.util.function.*
  • 我不确定,但这可能与code.google.com/p/android/issues/detail?id=211386有关
  • 很遗憾没有。我仍在使用retrolambda,而不是杰克。那里的图书馆没有问题。
  • 使用 retrolambda 将 bychan 编译为 Java 7 是一个稍微有点骇人听闻的解决方法。您必须将六个接口默认方法(Lexeme 中的 5 个,Token 中的 1 个)替换为抽象方法,并在实现类中添加相应的默认实现。应该在一两个小时内完成。

标签: java android java-8


【解决方案1】:

我不建议使用 java 8。现在不支持它。但是,它甚至会:记住,每个设备都有自己的不会更新的 java 机器。我的意思是,如果您想确保您的应用程序正常工作,请将您的项目设置为 java 6。旧设备永远不支持最新的 JMV

也阅读此讨论

Which JDK version (Language Level) is required for Android Studio?

【讨论】:

  • 我不打算实际使用这个应用程序。刚学安卓。但毕竟我见过,我认为Android相当混乱。例如。 View.getTextSize() 返回 pxView.setTextSize(size) 需要 sp
  • @DanielCheung,未来您会感到惊讶,因为某些 API 的工作方式无法预测:取决于供应商和设备型号
【解决方案2】:

Android SDK java.util.function.Function 和java.util.function.Predicate 接口,因为Java 8 允许函数式接口包含默认方法,这仅在SDK 24 及更高版本中受支持。我在使用消费者时遇到了这个问题,我修复它的方法是创建自己的java.util.function.Consumer 接口小丑,没有所有默认方法。 您还可以通过将应用的最低 SDK 增加到 24 来解决此问题。

更新

将以下内容添加到您的 build.gradle 文件中

defaultConfig {

  jackOptions {
    enabled true
  }
}
compileOptions {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}

【讨论】:

  • 我刚刚尝试将 minsdk 设置更改为 24 并出现同样的错误
  • 将 defaultConfig { ... jackOptions { enabled true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }` 添加到 build.gradle 文件中
  • 你看到我的 gradle 更新了吗?我有完全相同的东西。
  • 我明白了。嗯,你提到你的 min SDK 是 24,但我在提供的 Gradle 文件中看到你有 minSdkVersion 21 。只是为了确保清楚,您可以尝试将其更改为 minSdkVersion 25
  • 我已正确安装,因为我只安装了 Java 8
【解决方案3】:

除了Java JDK 1.8 部分外,整体设置对我来说看起来不错。您需要在 Android Studio 中设置正确的 JDK 安装文件夹路径才能使用所有新的 Java 8 功能。

【讨论】:

  • 我做到了,我已将构建 JDK 设置为我的 1.8 JDK 位置。
  • 您能否确认您已在系统中正确安装了 java 1.8?您是否已将 java 添加到系统路径中? IDE 不允许您使用 java 1.8,因为很明显您在将 java 设置/安装到系统时搞砸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2016-04-12
  • 1970-01-01
  • 2011-11-25
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多