Java lambda主体中变量的实例化
我写了lambda表达式的所有规则,但我对此有怀疑 何时使用lambda lamda表达式仅用于重写函数接口的抽象方法。不重写具体类、抽象类或非函数接口的方法。事实上,在所有这些情况下都会出现编译器错误 lambda的主体:返回和{}之间的关系Java lambda主体中变量的实例化,java,lambda,local-variables,Java,Lambda,Local Variables,我写了lambda表达式的所有规则,但我对此有怀疑 何时使用lambda lamda表达式仅用于重写函数接口的抽象方法。不重写具体类、抽象类或非函数接口的方法。事实上,在所有这些情况下都会出现编译器错误 lambda的主体:返回和{}之间的关系 如果我将lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回一个类型,那么我必须使用return+ 如果我把lambda的主体放在大括号{}中,并且我的函数接口的抽象方法返回void,我就不必使用return+ 如果我不把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所在的方法或块的局部变量具有不同的名称
- 如果我有0个参数或多个参数,则括号()是必需的
- 如果我只有一个参数,括号()不是必需的
- 如果是明确的,则不必声明参数的类型
- 局部变量,如果它们是最终的或实际上是最终的
- 实例变量,它们不一定是最终的
- 静态变量,不一定是最终变量
- 如果lambda在实例方法中,则声明“this”
- 如果lambda是实例变量,则声明“this”
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}
,您也不能编写,这也是非法的。