Android和Lambda

Ysc*_*sch 12 java eclipse lambda android adt

我需要将一些代码与Java lambda函数的广泛使用集成在一起.我有几个限制要求我使用Eclipse Mars开发我的项目,使用最新的ADT插件,而不是Android Studio.

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

Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.
Run Code Online (Sandbox Code Playgroud)

这两个人怎么能和睦相处?

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

Aar*_* He 11

正如@dhke所说,Android上还没有支持Java 8.

使用Java 8,Build for Java 6/7

但您仍然可以使用JDK 8来开发Android应用程序.您只需将源兼容性设置为6或7取决于您的minSDKVersion.因此,您将丢失Java 8中引入的任何新功能,例如lambda.

Lamda的后端口

由于您广泛使用lambda,Retrolambda可能是您的选择.它为Java 8之前的版本提供lambda的后端口.它具有Maven/Gradle /命令行插件以启用支持.

其他Backports

如果您需要其他Java 8功能,AFAIK,ThreeTen ABP为Java 8 Date Time API提供后端支持.


dhk*_*hke 6

您目前无法(至少在Android 5.1.1中)在Android上使用lambda函数.

Lambda函数需要新的Dalvik(不一定是JVM!)操作码(liberate-variable,box-lambda,unbox-lambda,capture-variable,create-lambda,invoke-lambda),Dalvik和ART目前都不支持.

看起来谷歌可能已安排(虽然似乎没有任何官方)Java 8.1支持5.1.1后(API级别23及更高版本).至少smali反汇编程序已经添加了对API级别的明确引用的支持:

https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38:

添加新的-X/ - 实验标志到[dis]汇编不在艺术中的操作码

  • 添加新的操作码liberate-variable,box-lambda,unbox-lambda,capture-variable,create-lambda,invoke-lambda
  • 添加对25x指令编码的支持
  • 添加LambdaTest以正确检查新的操作码组装/反汇编

并且

https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38#diff-5d7892344c0b747d3667bf8623c690c5R66

options.apiLevel = 23;  // since we need at least level 23 for lambda opcodes
Run Code Online (Sandbox Code Playgroud)

这仅标记操作码,而不是必要的库更改.它也没有告诉我们关于Android本身的任何信息,因此我建议不要将其作为官方发布时间表.