Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何抑制匿名新runnable()可以替换为lambda_Java_Android_Lambda_Java 8 - Fatal编程技术网

Java 如何抑制匿名新runnable()可以替换为lambda

Java 如何抑制匿名新runnable()可以替换为lambda,java,android,lambda,java-8,Java,Android,Lambda,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); } }); 我在谷歌上搜索非常努力,似乎是用lambda表达式

我得到了“匿名新runnable()可以替换为lambda”警告,代码如下

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

    @Override
    public void run() {
        sv.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
我在谷歌上搜索非常努力,似乎是用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表达式,即使它无法编译。是虫子吗

此外,我尝试使用,但它很难用于biginner

由于我不能编译我的代码,我不确定上面的lambda表达式是否正确

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


感谢您的帮助。

首先,您必须了解和之间的区别。

进一步阅读运行时与编译时错误:


出现错误的原因是Java<1.8版本不支持它

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

下面是这样做的过程:

我希望这会有所帮助。

首先,“匿名新runnable()可以替换为lambda”是一个警告。虽然这样的警告没有编译器错误那么严重,但您仍然应该了解警告的原因,以便在知情的情况下决定如何处理它。在这种情况下,警告来自IDE,而不是编译器,可以安全地忽略。Android Studio应该有一个可以禁用此警告的设置,但我一直无法找到确切的方法。我首先单击源代码中的
newrunnable()
文本,然后按Alt Enter键查看快速修复选项

或者,如果您想在代码中使用lambda函数,您需要启用对Java8的支持,作为您得到的错误消息状态。请注意,某些Java8功能仅在您的应用程序以KitKat或更高版本为目标时可用。早期版本的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
    }
}
重要的部分是
编译选项
闭包。其余部分是给出该文件所属的上下文

注意,我还没有编译和测试这个。另外,我不确定您是否同时需要
sourceCompatibility
targetCompatibility
。我建议您进行一些研究和实验,以确定是否需要这两种方法,以便在您希望针对的设备上编译和运行您的应用程序

资料来源:


在谷歌搜索之后,我意识到Android还没有正式支持JDK8

虽然我们可以使用JDK8风格的编码(对于Android Studio来说是),或者,它们只是一种风格

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


在我卸载JDK8并安装JDK7之后,IDE没有警告使用lambda表达式,或者没有出现lambda表达式在源代码1.7中不受支持的编译错误。

更重要的是,OP需要了解警告和编译器错误之间的区别。感谢您的建议,我已经更新了我的答案。另外,您提供的链接似乎给出了设置AS使用的JDK安装的说明。它没有涉及设置选项,这些选项控制源代码中支持的Java版本及其附带的功能。感谢您告诉我有关错误和警告、运行时和编译时的信息。您使用的是哪一版本的Android Studio?我使用的是最新版本的Ver.1.2.2。这不是lint警告,更可能是IDE提示。@assylias感谢您的澄清。我希望AS能够更清楚地了解它给出的任何消息的严重性级别……或者我没有经常遇到这样的问题,不知道AS如何表示与实际编译器错误的区别。当然,我的主要观点是正确的。此消息不是严重问题,可以安全忽略。感谢您的解释。我知道我可以无视警告,但我不希望在我的希望中得到警告。根据您的建议,我可以找到替换lambda表达式的方法<代码>sv.post(()->sv.fullScroll(ScrollView.FOCUS_DOWN))似乎sourceCompatibility和targetCompatibility都是必需的。但当我在Android Studio中按下run按钮时,我得到com.sun.tools.javac.code.Symbol$CompletionFailure:java.lang.invoke.MethodType的类文件找不到错误。我应该退出使用lambda吗?@xanadu62我建议你用谷歌搜索那个错误消息,找出解决方法。谷歌搜索是一个更好的选择。除此之外,如果问题中指定的问题已经解决,那么您应该接受一个答案:)快乐编码。