在 lambda 主体中实例化变量
instantiation of variables in body of lambda
我把lambda表达式的规则都写出来了,但是我有一个疑问
何时使用 lambda
lamda 表达式仅用于覆盖功能接口的抽象方法。不要覆盖具体 类、抽象 类 或非功能接口的方法。事实上,在所有这些情况下都会出现编译器错误。
lambda 的主体:return 和 {}
之间的关系
- 如果我将 lambda 的主体放在大括号 {} 中并且我的功能接口的抽象方法 return 是一个类型,我必须使用 return + ;
如果我将 lambda 的主体放在大括号中{}并且我的功能接口的抽象方法 return 无效,我就不必使用 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
}
}
大括号 {} 是必需的,如果:
我不止一个说法;
我需要return(明确或隐含)。
lambda 的参数
我的 lambda 表达式的参数必须与我的 lambda 所在的方法或块的局部变量具有不同的名称。
如果我有0个参数或多个参数,括号()是必须的。
如果我只有一个参数,括号 () 不是必需的
如果是明确的,则不强制声明参数类型。
lambda 主体:变量和 'this'
在我的 lambda 表达式的主体中,我可以采用
局部变量,如果它们是最终的或实际上是最终的;
实例变量,它们不一定是最终的;
静态变量,它们不一定是最终的;
在我的 lambda 表达式中,我可以:
如果 lambda 在实例方法中,则声明 'this';
如果 lambda 是实例变量,则声明 'this'。
如果 lambda 在静态方法中,我不能在我的 lambda 表达式的主体中声明 'this',否则会出现编译错误。
这是我的问题:我知道在我的 lambda 表达式的主体中,我可以声明变量,它们可以是最终的也可以不是。但是在我的代码中我有编译器错误:
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;
有 void 类型。
如果您不想使用 return 那个局部变量,只需将其替换为
MiaInterfaccia m = () -> {
int c = 0;
return c;
}
Why is there this compiler error?
因为 Java 语言设计者正确地决定,您提出的语法没有任何价值。我们已经知道 return 类型;我们可以从 MiaInterfaccia
看到它。这是一个 int
.
提供的标识符c
有什么用?它在任何范围内都不可用,因此任何东西都不可能引用它。
添加了 Lambda 以减少 匿名内部 类 的冗长程度。 int c =
只会增加不必要的冗长。
正确的写法是
MiaInterfaccia m = () -> 0;
如果您更愿意将其视为编译器添加隐式 returns(我个人认为这没有帮助,但您似乎觉得它很有说服力),那么以下内容无效 Java 要么。
int foo()
{
return int c = 0;
}
正如@Naya 提到的,我只想补充一点,如果你不想使用大括号,那么
唯一可能的陈述是一个,而且必须是 return 值,
但是在这里,
int c = 0;
没有 returning 任何东西,
如果您想尝试使用布尔值,您将更好地了解当您只有一条语句时 returned 的价值,
Boolean assignment();
MiaInterfaccia m = () -> true == false;
MiaInterfaccia m = () -> true;
MiaInterfaccia m = () -> false;
MiaInterfaccia m = () -> true != false;
我把lambda表达式的规则都写出来了,但是我有一个疑问
何时使用 lambda
lamda 表达式仅用于覆盖功能接口的抽象方法。不要覆盖具体 类、抽象 类 或非功能接口的方法。事实上,在所有这些情况下都会出现编译器错误。
lambda 的主体:return 和 {}
之间的关系- 如果我将 lambda 的主体放在大括号 {} 中并且我的功能接口的抽象方法 return 是一个类型,我必须使用 return + ;
如果我将 lambda 的主体放在大括号中{}并且我的功能接口的抽象方法 return 无效,我就不必使用 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
}
}
大括号 {} 是必需的,如果:
我不止一个说法;
我需要return(明确或隐含)。
lambda 的参数
我的 lambda 表达式的参数必须与我的 lambda 所在的方法或块的局部变量具有不同的名称。
如果我有0个参数或多个参数,括号()是必须的。
如果我只有一个参数,括号 () 不是必需的
如果是明确的,则不强制声明参数类型。
lambda 主体:变量和 'this'
在我的 lambda 表达式的主体中,我可以采用
局部变量,如果它们是最终的或实际上是最终的;
实例变量,它们不一定是最终的;
静态变量,它们不一定是最终的;
在我的 lambda 表达式中,我可以:
如果 lambda 在实例方法中,则声明 'this';
如果 lambda 是实例变量,则声明 'this'。
如果 lambda 在静态方法中,我不能在我的 lambda 表达式的主体中声明 'this',否则会出现编译错误。
这是我的问题:我知道在我的 lambda 表达式的主体中,我可以声明变量,它们可以是最终的也可以不是。但是在我的代码中我有编译器错误:
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;
有 void 类型。
如果您不想使用 return 那个局部变量,只需将其替换为
MiaInterfaccia m = () -> {
int c = 0;
return c;
}
Why is there this compiler error?
因为 Java 语言设计者正确地决定,您提出的语法没有任何价值。我们已经知道 return 类型;我们可以从 MiaInterfaccia
看到它。这是一个 int
.
提供的标识符c
有什么用?它在任何范围内都不可用,因此任何东西都不可能引用它。
添加了 Lambda 以减少 匿名内部 类 的冗长程度。 int c =
只会增加不必要的冗长。
正确的写法是
MiaInterfaccia m = () -> 0;
如果您更愿意将其视为编译器添加隐式 returns(我个人认为这没有帮助,但您似乎觉得它很有说服力),那么以下内容无效 Java 要么。
int foo()
{
return int c = 0;
}
正如@Naya 提到的,我只想补充一点,如果你不想使用大括号,那么 唯一可能的陈述是一个,而且必须是 return 值,
但是在这里,
int c = 0;
没有 returning 任何东西, 如果您想尝试使用布尔值,您将更好地了解当您只有一条语句时 returned 的价值,
Boolean assignment();
MiaInterfaccia m = () -> true == false;
MiaInterfaccia m = () -> true;
MiaInterfaccia m = () -> false;
MiaInterfaccia m = () -> true != false;