java中的Lambdas:变量vs类字段
lambda中的变量必须是有效的final。好啊 但为什么在下面的示例代码中允许分配类字段值呢 堆和堆栈会导致这种差异吗?为什么?java中的Lambdas:变量vs类字段,java,variables,lambda,field,Java,Variables,Lambda,Field,lambda中的变量必须是有效的final。好啊 但为什么在下面的示例代码中允许分配类字段值呢 堆和堆栈会导致这种差异吗?为什么? class Scratch { public String field = "class field"; public void example() { Function<String, Integer> funcWithField = s -> { field =
class Scratch
{
public String field = "class field";
public void example()
{
Function<String, Integer> funcWithField = s ->
{
field = "New field value from lambda";
// IT`s OK here
return field.length();
};
String variable = "var";
Function<String, Integer> funcWithVariable = s ->
{
// Though such things are restricted!
// variable = "some other loooong value for variable";
return variable.length();
};
}
}
类刮擦
{
公共字符串字段=“类字段”;
公共无效示例()
{
函数funcWithField=s->
{
field=“来自lambda的新字段值”;
//这里没问题
返回字段.length();
};
字符串变量=“var”;
函数funcWithVariable=s->
{
//虽然这样的事情是有限制的!
//variable=“变量的其他变量值”;
返回变量.length();
};
}
}
下面是我的“即兴”解释(不确定是否完全正确):使用字段的lambda将在其闭包中捕获类实例。您不能使用局部变量,因为闭包无法捕获范围。“您只能在局部范围内修改局部变量”。在兰博达斯之前是这样的。多线程lambda正在改变游戏,为了保持关于局部变量的声明为真,对参与lamda代码的局部变量添加了最终限制。类属性从未出现过这种“局部范围”问题,因此这里没有添加其他限制。下面是我的“非正式”解释(不确定是否完全正确):使用字段的lambda将在其闭包中捕获类实例。您不能使用局部变量,因为闭包无法捕获范围。“您只能在局部范围内修改局部变量”。在兰博达斯之前是这样的。多线程lambda正在改变游戏,为了保持关于局部变量的声明为真,对参与lamda代码的局部变量添加了最终限制。类属性从来没有这个“局部范围”问题,因此这里没有添加额外的限制。