Lambda作用域:
在Lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。但是如果访问局部变量,要求局部变量必须是final修饰的。
注意:上面代码中,一旦匿名内部类中使用了i,则i会自动被编排为final的。
首先我们来看下使用匿名内部类是如何实现的:
package com.test.cgb; public class CryptonymInnerTest { public static void main(String[] args) { int i = 9; // CryptonymInnerInterface m1 = new CryptonymInnerInterface() { @Override public int sum(int num1 , int num2) { System.out.println(i); return num1 + num2; } }; m1.sum(123, 456); } }
打印结果为9
如何证明i是被final修饰的:
下面使用Lambda表达式实现如下:
public class CryptonymInnerTest { public static void main(String[] args) { // 使用Lambda表达式 int i = 9; CryptonymInnerInterface m1 = (num1, num2) -> { System.out.println(i); return num1 + num2; }; m1.sum(123, 456); } }