others - 捕获局部变量的java lambda表达式

下面的代码:


 public synchronized void capture() {



 int localVariable = 100;



 Interf i = (text) -> System.out.println(text + localVariable);



 i.m1("This local variable is:");



 localVariable = 1000;


 }


}



时间:

答案是你的变量在方法结束时超出了范围,如果Final变量只是将值复制到lambda中,那么很容易用解决这个问题,因为lambda表达式中的代码也可以在方法(可修改变量已被垃圾收集的地方)之外运行,这将不能工作,你还不能预期编译器在你的lambda表达式外部修改时,不能对变量进行某种复制,希望能把它清理干净。

编译器抛出错误,指出它必须是final或有效final 。

那是因为它按照规则来做,不管你是否真正防范了所有并发问题—如果它不是有效的final,它就不会编译。

...