在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