Java Android和Lambda

Java Android和Lambda,java,android,eclipse,lambda,adt,Java,Android,Eclipse,Lambda,Adt,我需要将一些代码与Java lambda函数的广泛使用结合起来。 我有几个限制要求我使用EclipseMars开发我的项目,使用最新的ADT插件,而不是Android Studio 问题是,使用Lambda函数需要使用1.8 JDK兼容性,但如果设置为1.8 JDK兼容性,我会收到以下消息: Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. 这两个人怎么能和睦相处呢 编辑: 正如我所问的关于A

我需要将一些代码与Java lambda函数的广泛使用结合起来。 我有几个限制要求我使用EclipseMars开发我的项目,使用最新的ADT插件,而不是Android Studio

问题是,使用Lambda函数需要使用1.8 JDK兼容性,但如果设置为1.8 JDK兼容性,我会收到以下消息:

Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.
这两个人怎么能和睦相处呢

编辑:
正如我所问的关于ADT Eclipse的问题一样,这并不是建议问题的重复,而且自从上次更新以来,Android确实支持Java 8,所以这不仅不是重复,而且这个问题现在(在上次更新1.5年后)已经过时了。

我认为这是行不通的

为了使用lambdas,您需要源代码兼容性级别1.8。为了让DEX编译器工作,您需要目标兼容性1.7。Eclipse不允许您将目标兼容性设置为低于源兼容性(下图)

请注意,这与IntelliJ的习惯无关,IntelliJ认为它比您更清楚您的代码应该是什么样子。它可以向您显示lambda,即使实际代码是匿名类


您当前无法(至少在Android 5.1.1之前)在Android上使用lambda函数。

Lambda函数需要Dalvik和ART目前都不支持的新Dalvik(不一定是JVM!)操作码(释放变量、框Lambda、取消框Lambda、捕获变量、创建Lambda、调用Lambda)

看起来谷歌可能已经计划(尽管似乎还没有官方消息)对Post5.1.1(API级别23及更高版本)的Java8支持。至少已经添加了对API级别的明确引用的支持:

:

将新的-X/--实验标志添加到[dis]汇编尚未出现的操作码

  • 添加新操作码释放变量、框lambda、取消框lambda、捕获变量、创建lambda、调用lambda
  • 添加对编码25x指令的支持
  • 添加LambdaTest以检查新操作码是否正确组装/反汇编
而且

这仅标记操作码,而不是必要的库更改。它也没有告诉我们关于Android本身的任何信息,所以我建议不要把它作为正式的发布时间表。

Android上Java 8语言功能的更新 Lambda被向后移植到旧版本的Android上。 这是Android Gradle Plugin 3.0及以上版本的一项功能,lambda作为其他Java 8语言功能的一部分,向后移植到较旧的Android操作系统版本

将此添加到Gradle构建脚本以启用该功能

android {
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}
有关详细信息,请参阅和

正如@dhke所说,Android上还不支持Java8

使用Java8,为Java6/7构建 但您仍然可以使用JDK 8开发Android应用程序。您只需将源代码兼容性设置为6或7,具体取决于您的
minSDKVersion
。因此,您将失去Java8中引入的任何新特性,比如您的案例中的lambda

南达后港 由于您广泛使用lambda,因此可能是您的一个选择。它为Java 8之前的版本提供lambda的后端口。它有Maven/Gradle/command-line插件来启用支持

其他后端口 如果您需要其他Java 8功能,AFAIK将为Java 8日期时间API提供后端口支持。

颠倒Lambda语法 据我所知,在新的Java8Lambda语法中所做的一切都可以使用老式Java代码来完成,比如匿名内部类。()()

为了减轻撤消Lambda语法的负担,一些ide(如)可以建议在Lambda语法的任意方向上自动修改代码。只需单击一次批准,语法就会自动神奇地交换。请参阅上的NetBeans文档

下面是一个NetBeans的屏幕截图,它提供了将按钮从Lambda语法转换为匿名内部类的功能。请注意,鼠标指针单击第107行的灯泡图标

要在IDE中启用此功能,需要在项目中临时启用Java8。撤消所有Lambda语法后,将项目切换回Java6/7。在NetBeans中,启用Java 8的方法是在您的项目中>
Properties>Sources>Source/Binary格式(弹出菜单)>1.8

Android确实支持Java8,所以这不仅仅是重复

开始发布Android支持有限的Java 8的功能请参见

要开始使用这些功能,您需要下载并设置Android N Preview SDK,其中包括 Gradle所需的工具链和更新的Android插件。如果你 尚未安装Android N预览SDK,请参阅

支持的Java 8语言功能和API

Android目前不支持所有Java 8语言功能。 但是,在开发应用程序时,现在可以使用以下功能 针对Android N预览版:

Android还支持一些额外的Java 8功能,您可以从更新中看到完整的细节:几天之后。它正式支持一项新的计划

从2017年3月14日起,谷歌

决定将对Java8语言特性的支持直接添加到当前的javac和dx工具集中,并反对使用Jack工具链。有了这个新的方向,依赖于Java类文件格式的现有工具和插件应该继续工作。今后,Android构建系统将在本机支持Java8语言功能。我们的目标是在未来几周内将其作为Android Studio的一部分发布,我们希望尽早与您分享这一决定


因此,我们可能不必在Android Studio中等待太久的Java 8。

这个问题的可能重复性是什么?阅读错误消息,他们不能。你只是有
android {
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}