在Java8之前,也就是Java没有lambda之前,在内部类内使用外部类的变量时,必须将变量置为final。
在有了lambda之后,对于在labmda函数内使用的外部变量的要求变松了,可以是“final”或者“有效的final”。有效的final意思是这个变量虽然没有显式的声明为final,但是实际上确实没有变更,编译就允许通过。示例如下
//可编译通过
for (int i = 0; i < 10; i++) {
int counter = i;
new Thread(() -> {
System.out.println("i = " + counter);
}).start();
}
//编译不通过
for (int i = 0; i < 10; i++) {
int counter = i;
new Thread(() -> {
System.out.println("i = " + counter);
}).start();
counter++; //不通过是因为这里
}
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/88

微信
支付宝