Android 和 Lambda
Android and Lambda
我需要将一些代码与 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.
两人怎么能和睦相处呢?
编辑:
这不是所建议问题的重复,因为我问的是 ADT Eclipse,自从该问题的最后一次更新以来,Android 确实支持 Java 8,所以这不仅不是重复的, 但这个问题现在(在上次更新后 1.5 年后)已经过时了。
我认为这行不通。
要使用 lambda,您需要源兼容级别 1.8。为了使 DEX 编译器工作,您需要目标兼容性 1.7。 Eclipse 不会让您将目标兼容性设置为低于源兼容性(下图)。
请注意,这与 IntelliJ 认为它比你更了解你的代码应该是什么样子的习惯无关。它可以向您显示 lambda,即使实际代码是匿名的 class.
您目前不能(至少在 Android 5.1.1 之前)在 Android.
上使用 lambda 函数
Lambda 函数需要新的 Dalvik(不一定是 JVM!)操作码(liberate-variable、box-lambda、unbox-lambda、capture-variable、create-lambda、invoke-lambda)目前 Dalvik 和 ART 都不支持为了。
看起来 google 可能已经安排好了(尽管似乎还没有正式消息)Java 8 支持 post 5.1.1(API 23 级和之后)。至少 smali disassembler 已经添加了对 API 级别的明确引用的支持:
https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38:
Add new -X/--experimental flag to [dis]assemble opcodes not in art yet
- Add new opcodes liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda
- Add support for encoding 25x instructions
- Adds LambdaTest to check new opcodes assemble/disassemble properly
还有
options.apiLevel = 23; // since we need at least level 23 for lambda opcodes
这只标记了操作码,而不是必要的库更改。它也没有告诉我们任何关于 Android 本身的信息,所以我建议不要将其作为官方发布时间表。
更新 Java 8 种语言功能 Android
Lambda 已返回到旧版本的 Android。
这是 Android Gradle 插件 3.0 及更高版本的功能,lambda 作为其他 [=48= 的一部分被移植回旧 Android OS 版本] 8种语言功能。
将此添加到您的 Gradle 构建脚本以启用该功能。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
有关详细信息,请参阅 Use Java 8 language features, and Android' Java 8 support。
正如@dhke 所说,Android 上尚不支持 Java 8。
使用 Java 8,构建 Java 6/7
但您仍然可以使用JDK 8 来开发Android 应用程序。您只需要将源兼容性设置为 6 或 7,具体取决于您的 minSDKVersion
。因此,您将失去 Java 8 中引入的任何新功能,例如您的情况下的 lambda。
Lamda 的向后移植
由于您广泛使用 lambda,Retrolambda 可能是您的一个选择。它为 Java 8 之前的版本提供了 lambda 的反向移植。它有 Maven/Gradle/command 行插件来启用支持。
其他向后移植
如果您需要其他 Java 8 功能,AFAIK,ThreeTen ABP 为 Java 8 日期时间 API.
提供向后移植支持
反转 Lambda 语法
据我所知,在新 Java 8 Lambda 语法中所做的一切都可以使用老式 Java 代码(例如匿名内部 class)来完成。 (Oracel Tutorial) (Oracle Quick Start)
为了减轻撤销 Lambda 语法的负担,一些 IDEs 例如 NetBeans can suggest automatic revision of code in either direction to/from Lambda syntax. With one-click of approval, the syntax is auto-magically swapped. See the NetBeans document on Using Lambda Expressions Support.
这是 NetBeans 提供的将 Vaadin button’s Button.ClickListener
从 Lambda 语法转换为匿名内部 class 的屏幕截图。请注意鼠标指针单击第 107 行的灯泡图标。
要在您的 IDE 中启用此功能,您需要暂时在您的项目中启用 Java 8。撤消所有 Lambda 语法后,将您的项目切换回 Java 6/7。在 NetBeans 中,启用 Java 8 的方法是在您的项目中 > Properties > Sources > Source/Binary Format (popup menu) > 1.8
.
Android does support Java 8, so no only is this not a duplicate
截至 Android N preview release Android support limited features of Java 8 see Java 8 Language Features
To start using these features, you need to download and set up Android
Studio 2.1 and the Android N Preview SDK, which includes the
required Jack toolchain and updated Android Plugin for Gradle. If you
haven't yet installed the Android N Preview SDK, see Set Up to Develop
for Android N.
支持Java 8种语言特性和API
Android does not currently support all Java 8 language features.
However, the following features are now available when developing apps
targeting the Android N Preview:
Default and static interface methods
Android 支持一些额外的 Java 8 项功能,您可以从 Java 8 Language Features
查看完整的详细信息
更新:几天以来,Android Studio 3.0 is out on stable. It officially supports a subset of Java 8 features, lambda expressions among them。
根据 this Android Developers Blogpost 自 2017 年 3 月 14 日起,google
decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.
所以我们可能不必在 Android Studio 中等待 Java 8。
我需要将一些代码与 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.
两人怎么能和睦相处呢?
编辑: 这不是所建议问题的重复,因为我问的是 ADT Eclipse,自从该问题的最后一次更新以来,Android 确实支持 Java 8,所以这不仅不是重复的, 但这个问题现在(在上次更新后 1.5 年后)已经过时了。
我认为这行不通。
要使用 lambda,您需要源兼容级别 1.8。为了使 DEX 编译器工作,您需要目标兼容性 1.7。 Eclipse 不会让您将目标兼容性设置为低于源兼容性(下图)。
请注意,这与 IntelliJ 认为它比你更了解你的代码应该是什么样子的习惯无关。它可以向您显示 lambda,即使实际代码是匿名的 class.
您目前不能(至少在 Android 5.1.1 之前)在 Android.
上使用 lambda 函数Lambda 函数需要新的 Dalvik(不一定是 JVM!)操作码(liberate-variable、box-lambda、unbox-lambda、capture-variable、create-lambda、invoke-lambda)目前 Dalvik 和 ART 都不支持为了。
看起来 google 可能已经安排好了(尽管似乎还没有正式消息)Java 8 支持 post 5.1.1(API 23 级和之后)。至少 smali disassembler 已经添加了对 API 级别的明确引用的支持:
https://github.com/JesusFreke/smali/commit/144951a9e9e6c87866245f2bdeebf0ebedaa0e38:
Add new -X/--experimental flag to [dis]assemble opcodes not in art yet
- Add new opcodes liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda
- Add support for encoding 25x instructions
- Adds LambdaTest to check new opcodes assemble/disassemble properly
还有
options.apiLevel = 23; // since we need at least level 23 for lambda opcodes
这只标记了操作码,而不是必要的库更改。它也没有告诉我们任何关于 Android 本身的信息,所以我建议不要将其作为官方发布时间表。
更新 Java 8 种语言功能 Android
Lambda 已返回到旧版本的 Android。
这是 Android Gradle 插件 3.0 及更高版本的功能,lambda 作为其他 [=48= 的一部分被移植回旧 Android OS 版本] 8种语言功能。
将此添加到您的 Gradle 构建脚本以启用该功能。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
有关详细信息,请参阅 Use Java 8 language features, and Android' Java 8 support。
正如@dhke 所说,Android 上尚不支持 Java 8。
使用 Java 8,构建 Java 6/7
但您仍然可以使用JDK 8 来开发Android 应用程序。您只需要将源兼容性设置为 6 或 7,具体取决于您的 minSDKVersion
。因此,您将失去 Java 8 中引入的任何新功能,例如您的情况下的 lambda。
Lamda 的向后移植
由于您广泛使用 lambda,Retrolambda 可能是您的一个选择。它为 Java 8 之前的版本提供了 lambda 的反向移植。它有 Maven/Gradle/command 行插件来启用支持。
其他向后移植
如果您需要其他 Java 8 功能,AFAIK,ThreeTen ABP 为 Java 8 日期时间 API.
提供向后移植支持反转 Lambda 语法
据我所知,在新 Java 8 Lambda 语法中所做的一切都可以使用老式 Java 代码(例如匿名内部 class)来完成。 (Oracel Tutorial) (Oracle Quick Start)
为了减轻撤销 Lambda 语法的负担,一些 IDEs 例如 NetBeans can suggest automatic revision of code in either direction to/from Lambda syntax. With one-click of approval, the syntax is auto-magically swapped. See the NetBeans document on Using Lambda Expressions Support.
这是 NetBeans 提供的将 Vaadin button’s Button.ClickListener
从 Lambda 语法转换为匿名内部 class 的屏幕截图。请注意鼠标指针单击第 107 行的灯泡图标。
要在您的 IDE 中启用此功能,您需要暂时在您的项目中启用 Java 8。撤消所有 Lambda 语法后,将您的项目切换回 Java 6/7。在 NetBeans 中,启用 Java 8 的方法是在您的项目中 > Properties > Sources > Source/Binary Format (popup menu) > 1.8
.
Android does support Java 8, so no only is this not a duplicate
截至 Android N preview release Android support limited features of Java 8 see Java 8 Language Features
To start using these features, you need to download and set up Android Studio 2.1 and the Android N Preview SDK, which includes the required Jack toolchain and updated Android Plugin for Gradle. If you haven't yet installed the Android N Preview SDK, see Set Up to Develop for Android N.
支持Java 8种语言特性和API
Android does not currently support all Java 8 language features. However, the following features are now available when developing apps targeting the Android N Preview:
Default and static interface methods
Android 支持一些额外的 Java 8 项功能,您可以从 Java 8 Language Features
查看完整的详细信息更新:几天以来,Android Studio 3.0 is out on stable. It officially supports a subset of Java 8 features, lambda expressions among them。
根据 this Android Developers Blogpost 自 2017 年 3 月 14 日起,google
decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.
所以我们可能不必在 Android Studio 中等待 Java 8。