gpt4 book ai didi

java - lambda 表达式和全局变量

转载 作者:行者123 更新时间:2023-12-02 09:36:10 24 4
gpt4 key购买 nike

我刚刚开始研究 Java 8 中的 lambda 表达式。我对有效的最终有点困惑。

初始化一次的局部变量实际上是final,但是全局变量呢,我可以更改全局变量的值并在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("--------------------------------------");
});
}
}

输出

Firstname: Vicky
Middle: V
Lastname: T
--------------------------------------
Firstname: Thakor
Middle: V
Lastname: T
--------------------------------------

最佳答案

当您在 lambda 中引用“全局”变量时,您实际上捕获了对 this 的引用,这实际上是最终的。

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

class Main {

class Box {
int value;
}

void foo() {
Box box = new Box();
Runnable r = () -> box.value++;
}
}

即使您要更改 box.value,您也是通过 box 引用来完成的,这实际上是最终的。同样,您的代码相当于

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

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

关于java - lambda 表达式和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30728716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com