在 lambda 主体中实例化变量

instantiation of variables in body of lambda

我把lambda表达式的规则都写出来了,但是我有一个疑问

何时使用 lambda

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

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 主体:变量和 'this'

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

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

如果 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;