我怎样才能抑制匿名新的runnable()可以替换为lambda

xan*_*291 8 java lambda android java-8

我得到了"匿名新的runnable()可以替换为lambda"警告与以下代码.

final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
sv.post(new Runnable() {

    @Override
    public void run() {
        sv.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
Run Code Online (Sandbox Code Playgroud)

我非常努力地在Google上搜索,似乎是使用lambda表达式重写...

final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
Runnable test = () -> sv.fullScroll(ScrollView.FOCUS_DOWN);
test.run();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行应用程序时,Android Studio会因错误而停止,如下所示:

Error:(78, 40) error: lambda expressions are not supported in -source 1.7
(use -source 8 or higher to enable lambda expressions)
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么Android Studio让我使用lambda表达式,即使它无法编译.这是一个错误吗?

此外,我尝试使用gradle-retrolambda,但它很难用于biginner.

由于我无法编译我的代码,我不确定上述lambda expresssion是否正确.

在我看来,IDE不应该抱怨代码无法编译.所以我认为应该抑制使用lambda表达式的警告.但我不知道怎么会......

任何帮助表示赞赏.

Cod*_*ice 8

首先,"anonymous new runnable()可以替换为lambda"是一个警告,如你所说.虽然这样的警告不像编译器错误那么严重,但您仍应了解警告的原因,以便做出明智的决定如何处理它.在这种情况下,警告来自IDE,而不是编译器,可以安全地忽略.Android Studio应该有一个设置,您可以在其中禁用此警告,但我一直无法找到确切的方法.我首先点击new Runnable()源代码中的文本,然后按Alt-Enter查看快速修复选项.

或者,如果要在代码中使用lambda函数,则需要启用对Java 8的支持,作为您获得的错误消息.请注意,某些Java 8功能仅在您的应用针对Kit Kat或更高版本时可用.早期版本的Android支持Lambda函数,因此在这种情况下您不必担心.要为项目启用Java 8,请将build.gradle文件修改为类似于以下内容:

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 19
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Run Code Online (Sandbox Code Playgroud)

关键是compileOptions关闭.剩下的就是给出文件所属的上下文.

请注意,我没有编译和测试过这个.另外,我不确定,如果你需要同时sourceCompatibilitytargetCompatibility.我建议你做一些研究和实验,以确定是否需要这两个,以便在你想要定位的设备上编译和运行你的应用程序.

资料来源:

如何在Android Studio和Gradle中设置-source 1.7

Java 8功能进入Android开发

  • @assylias感谢您的澄清.我希望AS能够更清楚地了解它给出的任何消息的严重程度......或者我可能没有遇到过这样的问题,经常知道AS如何表示与实际编译器错误的区别.当然,我的主要观点是.该消息不是一个严重的问题,可以安全地忽略. (2认同)
  • @ xanadu62我建议你谷歌那个错误信息来弄清楚如何解决它. (2认同)

xan*_*291 1

经过谷歌搜索,我发现Android还没有正式支持JDK8。 请参阅此链接

虽然我们可以使用Retrolambda(对于 Android Studio,它是gradle-retrolambda)或RxJava进行 JDK8 风格的编码,但它们只是一种风格......

我的问题是由于安装JDK8引起的,而不是应该安装JDK7。
我认为最好安装JDK8,因为oracle现在正式支持JDK8并且已经终止更新JDK7,但这是错误的想法。

我卸载JDK8并安装JDK7后,IDE不会警告使用lambda表达式,或者编译时不会出现lambda表达式不支持-source 1.7错误。