eclipse 安卓和 Lambda

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31898083/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 22:47:09  来源:igfitidea点击:

Android and Lambda

javaandroideclipselambdaadt

提问by Ysch

I need to integrate some code with extensive usage of Java lambda functions. Several restrictions I have demand that I develop my project using Eclipse Mars, with the latest ADT plugin, and not Android Studio.

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

The problem is that using Lambda functions demands using 1.8 JDK compliance, but if set so, I get this message:

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

Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.

How can the two live together in harmony?

两者如何和谐相处?

Edit: This is not a a duplicate of the questions suggested, as I'm asking about ADT Eclipse, and since the last update in that question, Android does support Java 8, so no only is this not a duplicate, but that question is now (after 1.5 yrs after the last update) obsolete.

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

采纳答案by Aaron He

Update on Java 8 language features on Android

Android 上的 Java 8 语言功能更新

Lambda is back ported to older versions of Android.

Lambda 回移植到旧版本的 Android。

This is a feature from Android Gradle Plugin 3.0 and above, lambda is back ported to older Android OS versions as part of other Java 8 language features.

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

Add this to your Gradle build scripts to enable the feature.

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

android {
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

For more details, see Use Java 8 language features, and Android' Java 8 support.

有关更多详细信息,请参阅使用 Java 8 语言功能Android 的 Java 8 支持

As @dhke said, there's no support for Java 8 on Android yet.

正如@dhke 所说,Android 尚不支持 Java 8。

Use Java 8, Build For Java 6/7

使用 Java 8,为 Java 6/7 构建

But you can still use JDK 8 to develop Android application. You just need to set source compatibility to either 6 or 7 depends on your minSDKVersion. Thus, you would lose any new features introduced in Java 8, like lambda in your case.

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

Backport of Lamda

Lamda 的后端

Since you have extensive usage of lambda, Retrolambdamight be an option for you. It provides backport of lambda for pre-Java 8 versions. It has Maven/Gradle/command line plugin to enable the support.

由于您广泛使用 lambda,因此Retrolambda可能是您的一个选择。它为 Java 8 之前的版本提供了 lambda 的反向移植。它有 Maven/Gradle/命令行插件来启用支持。

Other Backports

其他向后移植

If you need other Java 8 features, AFAIK, ThreeTen ABPprovides backport support for Java 8 Date Time API.

如果您需要其他 Java 8 功能,AFAIK,ThreeTen ABP为 Java 8 Date Time API 提供了向后移植支持。

回答by dhke

You cannot currently (as up to at least Android 5.1.1) use lambda functions on Android.

您目前不能(至少在 Android 5.1.1 之前)在 Android 上使用 lambda 函数。

Lambda functions require new Dalvik (not necessarily JVM!) opcodes (liberate-variable, box-lambda, unbox-lambda, capture-variable, create-lambda, invoke-lambda) that neither Dalvik nor ART currently have support for.

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

It looks like google might have scheduled (though nothing seems to be official yet) Java 8 support for post 5.1.1 (API Level 23 and later). At least the smali disassembleralready added support with a distinct reference to the API level:

看起来 google 可能已经安排了(尽管似乎还没有正式)Java 8 支持 5.1.1 后(API 级别 23 及更高版本)。至少smali 反汇编器已经添加了对 API 级别的明确引用的支持:

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

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

添加新的 -X/--experimental 标志以 [dis]assemble 尚未在艺术中的操作码

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

And also

并且

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

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

options.apiLevel = 23;  // since we need at least level 23 for lambda opcodes

This only marks the opcodes, not the necessary library changes. It also does not tell us anything about Android itself, so I'd suggest not to take this as an official release schedule.

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

回答by dhke

Android does support Java 8, so no only is this not a duplicate

Android 确实支持 Java 8,所以这不仅不是重复的

As of Android N previewrelease Android support limitedfeatures of Java 8see Java 8 Language Features

Android N 预览版开始,Android 支持Java 8 的有限功能,请参阅Java 8 语言功能

To start using these features, you need to download and set up Android Studio 2.1and the Android N Preview SDK, which includes the required Hymantoolchain 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.

要开始使用这些功能,您需要下载并设置Android Studio 2.1和 Android N Preview SDK,其中包括所需的Hyman工具链和更新的 Android Plugin for Gradle。如果您尚未安装 Android N Preview SDK,请参阅设置以针对 Android N 进行开发

Supported Java 8 Language Features and APIs

支持的 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:

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

Default and static interface methods

默认和静态接口方法

Lambda expressions

Lambda 表达式

Repeatable annotations

可重复的注释

There are some additional Java 8 features which Android support, you can see complete detail from Java 8 Language Features

Android 支持一些额外的 Java 8 功能,您可以从Java 8 语言功能中查看完整的详细信息

回答by LPeteR90

UPDATE: Since a few days, Android Studio 3.0 is out on stable. It officially supports a subset of Java 8 features, lambda expressions among them.

更新:几天后,Android Studio 3.0 发布稳定版。它正式支持Java 8 特性的一个子集,其中包括 lambda 表达式

According to this Android Developers Blogpostfrom March 14th, 2017, google

根据2017 年 3 月 14 日的这篇 Android 开发者博客文章,谷歌

decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Hyman 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.

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

So we probably won't have to wait much longer for Java 8 in Android Studio.

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

回答by G. Blake Meike

I don't think this is going to work.

我不认为这会奏效。

In order to use lambdas, you need source compatibility level 1.8. In order for the DEX compiler to work you need target compatibility 1.7. Eclipse is not going to let you set the target compatibility below the source compatibility (picture below).

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

Note that this is unrelated to IntelliJ's habit of thinking it knows way better than you do, what your code should look like. It can show you a lambda, even when the actual code is an anonymous class.

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

enter image description here

在此处输入图片说明

回答by Basil Bourque

Reverse The Lambda Syntax

反转 Lambda 语法

As far as I know, everything done in the new Java 8 Lambda syntax can be done using old-school Java code such as anonymous inner class. (Oracel Tutorial) (Oracle Quick Start)

据我所知,在新的 Java 8 Lambda 语法中所做的一切都可以使用老式 Java 代码(例如匿名内部类)来完成。( Oracel 教程) ( Oracle 快速入门)

To ease the burden of undoing the Lambda syntax, some IDEs such as NetBeanscan 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.

为了减轻撤销 Lambda 语法的负担,一些 IDE(例如NetBeans)可以建议在与 Lambda 语法之间的任一方向上自动修改代码。一键批准,语法会自动神奇地交换。请参阅有关使用 Lambda 表达式支持的 NetBeans 文档。

Here is a screenshot of NetBeans offering to turn a Vaadinbutton's Button.ClickListenerfrom Lambda syntax to an anonymous inner class. Notice the mouse pointer clicking on the light bulb icon on line # 107.

这是 NetBeans 提供的将Vaadin按钮Button.ClickListener从 Lambda 语法转换为匿名内部类的屏幕截图。请注意鼠标指针单击第 107 行的灯泡图标。

screenshot of NetBeans offering to switch Lambda syntax to an anonymous inner class

NetBeans 提供将 Lambda 语法切换为匿名内部类的屏幕截图

To enable this feature in your IDE, you will need to enable Java 8 in your project temporarily. After undoing all the Lambda syntax, switch your project back to Java 6/7. In NetBeans the way to enable Java 8 is in your project > Properties > Sources > Source/Binary Format (popup menu) > 1.8.

要在 IDE 中启用此功能,您需要在项目中临时启用 Java 8。撤消所有 Lambda 语法后,将您的项目切换回 Java 6/7。在 NetBeans 中,启用 Java 8 的方法是在您的项目 > 中Properties > Sources > Source/Binary Format (popup menu) > 1.8