Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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中的Lambdas:变量vs类字段_Java_Variables_Lambda_Field - Fatal编程技术网

java中的Lambdas:变量vs类字段

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 =

lambda中的变量必须是有效的final。好啊 但为什么在下面的示例代码中允许分配类字段值呢

堆和堆栈会导致这种差异吗?为什么?

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代码的局部变量添加了最终限制。类属性从来没有这个“局部范围”问题,因此这里没有添加额外的限制。