Java lambda表达式与全局变量
我刚刚开始研究Java8中的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
有点困惑
初始化一次的局部变量实际上是最终的
,但全局变量呢,我可以更改全局变量的值并在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);