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

时间:2015-06-12 04:58:25

标签: java android lambda java-8

我得到了#34;匿名新的runnable()可以替换为lambda"使用以下代码发出警告。

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

    @Override
    public void run() {
        sv.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

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

final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
Runnable test = () -> sv.fullScroll(ScrollView.FOCUS_DOWN);
test.run();

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

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

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

另外,我尝试使用gradle-retrolambda,但很难用于biginner。

由于我无法编译代码,因此我不确定上述lambda表达是否正确。

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

首先,“匿名新的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
    }
}

重要的部分是compileOptions关闭。其余的是给出它属于文件的上下文。

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

来源:

How to set -source 1.7 in Android Studio and Gradle

Java 8 features into Android Development

答案 1 :(得分:1)

首先,必须知道compile time errorsrun-time errors之间的差异。

进一步阅读运行时与编译时错误:
Runtime vs Compile time
Warnings and Errors

您遇到的错误背后的原因是它不支持Java< 1.8版本。

此问题的解决方案是您应该将项目的Java版本更改为1.8

这是这样做的程序:
Using JDK 7 Or Higher With Android Studio And Eclipse On Mac OSX

我希望这会有所帮助。

答案 2 :(得分:1)

在使用Google搜索后,我意识到Android尚未正式支持JDK8。 See this link

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

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

在我卸载JDK8并安装JDK7之后,IDE没有警告使用lambda表达式,或者没有发生编译时-source 1.7 错误不支持lambda表达式。