Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 lambda主体中变量的实例化_Java_Lambda_Local Variables - Fatal编程技术网

Java lambda主体中变量的实例化

Java lambda主体中变量的实例化,java,lambda,local-variables,Java,Lambda,Local Variables,我写了lambda表达式的所有规则,但我对此有怀疑 何时使用lambda lamda表达式仅用于重写函数接口的抽象方法。不重写具体类、抽象类或非函数接口的方法。事实上,在所有这些情况下都会出现编译器错误 lambda的主体:返回和{}之间的关系 如果我将lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回一个类型,那么我必须使用return+ 如果我把lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回void,我就不必使用return+ 如果我不把lambda的主

我写了lambda表达式的所有规则,但我对此有怀疑

何时使用lambda

lamda表达式仅用于重写函数接口的抽象方法。不重写具体类、抽象类或非函数接口的方法。事实上,在所有这些情况下都会出现编译器错误

lambda的主体:返回和{}之间的关系

  • 如果我将lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回一个类型,那么我必须使用return+
  • 如果我把lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回void,我就不必使用return+

  • 如果我不把lambda的主体放在大括号{}中,我就不能使用return+

事实上,我有:

interface MiaInterfaccia{
    int assignment();
}

public class TestAssignmentOperator {
    public static void main(String[] args) {

        MiaInterfaccia m = () -> { int c = 0; }; //compilation error because, compiler adds 'the return;' so the return is void and not int

        int c = 5;
        MiaInterfaccia m = () -> c; //it is ok
   }
}
大括号{}在以下情况下是必需的:

  • 我不仅仅是一份声明

  • 我需要返回(显式或隐式)

lambda的参数

  • lambda表达式的参数必须与lambda所在的方法或块的局部变量具有不同的名称

  • 如果我有0个参数或多个参数,则括号()是必需的

  • 如果我只有一个参数,括号()不是必需的

  • 如果是明确的,则不必声明参数的类型

lambda主体:变量和“this”

在我的lambda表达式的主体中,我可以

  • 局部变量,如果它们是最终的或实际上是最终的

  • 实例变量,它们不一定是最终的

  • 静态变量,不一定是最终变量

在lambda表达式的主体中,我可以:

  • 如果lambda在实例方法中,则声明“this”

  • 如果lambda是实例变量,则声明“this”

如果lambda位于静态方法中,我不能在lambda表达式的主体中声明“this”,否则将出现编译错误

这是我的问题:我知道在lambda表达式的主体中,我可以声明变量,它们可以是final,也可以不是final。但在我的代码中有编译器错误:

interface MiaInterfaccia{
    int assignment();
}

public class TestAssignmentOperator {
    public static void main(String[] args) {

        MiaInterfaccia m = () -> int c = 0; //compilation error
    }
}
为什么会出现这个编译器错误

非常感谢


A.

错误是因为lambda
()->int c=0具有无效类型。
如果不想使用,请返回局部变量,并将其替换为

 MiaInterfaccia m = () -> {
     int c = 0; 
     return c;
 }
为什么会出现这个编译器错误

因为Java语言设计者正确地认为,您提出的语法没有增加任何价值。我们已经知道返回类型;我们可以从MiaInterfaccia中看到它。这是一个
int

标识符
c
提供了什么用途?它在任何范围内都不可用,因此任何东西都不可能引用它

添加lambda是为了减少匿名内部类的冗长
int c=
只是增加了不必要的冗长

正确的书写方法是

MiaInterfaccia m = () -> 0;
如果您更愿意将其视为添加隐式返回的编译器(我个人认为这没有帮助,但您似乎觉得它很有吸引力),那么以下内容也不是有效的Java

int foo()
{
    return int c = 0;
}

正如@Naya提到的,我只想补充一句,如果你不想使用大括号的话 唯一可能的语句是1,并且必须是返回值

但是在这里

int c = 0; 
没有归还任何东西, 如果您想尝试使用boolean,您将更好地了解在使用单个语句时如何返回值

Boolean assignment();

MiaInterfaccia m = () ->  true == false;
MiaInterfaccia m = () ->  true;
MiaInterfaccia m = () ->  false;
MiaInterfaccia m = () ->  true != false;

变量声明不是表达式,也不返回值。这不仅仅是关于lambda表达式。例如,如果(布尔值a=true){//do something}
,您也不能编写
,这也是非法的。