Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 lambda表达式与全局变量_Java_Lambda - Fatal编程技术网

Java lambda表达式与全局变量

Java lambda表达式与全局变量,java,lambda,Java,Lambda,我刚刚开始研究Java8中的lambda表达式。我对有点困惑 初始化一次的局部变量实际上是最终的,但全局变量呢,我可以更改全局变量的值并在lambda表达式中使用它。那么,为什么局部变量应该是有效的final。我找不到任何关于javadoc的文章 import java.util.ArrayList; import java.util.List; public class Main { private String lastname = "Thakor"; public s

我刚刚开始研究Java8中的lambda表达式。我对
有点困惑

初始化一次的局部变量实际上是最终的
,但全局变量呢,我可以更改全局变量的值并在lambda表达式中使用它。那么,为什么局部变量应该是
有效的final
。我找不到任何关于javadoc的文章

import java.util.ArrayList;
import java.util.List;

public class Main {

    private String lastname = "Thakor";

    public static void main(String[] args) {
        Main objMain = new Main();
        objMain.test();
    }

    public void test(){
        List<String> listStrings = new ArrayList<String>();
        listStrings.add("Vicky");
        listStrings.add("Thakor");

        String middlename = "V";
        //Local variable middlename defined in an enclosing scope must be final or effectively final
        /* middlename = "T";*/ 

        /**
         * In case of global variable, why lambda expression not throwing error...
         * Local variable middlename defined in an enclosing scope must be final or effectively final
         */
        lastname = "T"; 

        listStrings.stream()
                        .forEach(firstname ->{
                            System.out.println("Firstname: " + firstname);
                            System.out.println("Middle: " + middlename);
                            System.out.println("Lastname: " + lastname);
                            System.out.println("--------------------------------------");
                        });
    }
}
当您在lambda中引用一个“全局”变量时,您实际上是在捕获对
this
的引用,这实际上是最终的

考虑以下代码段(未测试):

即使您正在更改
box.value
,您也是通过
box
引用进行更改的,该引用实际上是最终的。类似地,您的代码相当于

System.out.println("Lastname: " + this.lastname);

这意味着您正在通过
引用访问
lastname
,该引用实际上是最终引用。

可能重复@JordiCastilla,而不是really@JordiCastilla我知道其中的区别,但我问的是全局变量。Java中没有全局变量。实例变量不在(立即)封闭范围内,它只是在那里使用。它是通过对对象本身的引用来访问的。@Vicky我想不起要求局部变量有效为final的确切原因,但我认为这与使用堆栈中局部变量的线程有关。很抱歉,我没有得到你的答案。“我还是很困惑。”维克萨科,你被困在哪一部分?您理解示例代码段吗?
通过this reference访问lastname
为什么通过reference访问时将变量引用为
有效的final
?它与局部变量有什么不同?坦率地说,我不明白背后的逻辑。你能解释一下java是如何从编译器级别到运行时处理它的吗?@VickyThakor,我最近看到它是这样说的:java闭包覆盖值,而不是变量<代码>框是一个值<代码>此是一个值<代码>最终变量是有效的值。允许可变变量在lambda中引用意味着lambda捕获变量本身,而不仅仅是它的值。全局变量可以更新,但不能用于最终声明的变量
class Main {

    class Box {
        int value;
    }

    void foo() {
        Box box = new Box();
        Runnable r = () -> box.value++;
    }
}
System.out.println("Lastname: " + this.lastname);