ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Lambda的范围 对于lambdab表达式外部的变量,其访问权限的粒度与匿名对象的方式非常类似。你能够访问局部对应的外部区域的局部final变量,以及成员变量和静态变量。 #### 访问局部变量 我们可以访问lambda表达式外部的final局部变量: ``` final int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); stringConverter.convert(2); // 3 ``` 但是与匿名对象不同的是,变量num并不需要一定是final。下面的代码依然是合法的: ``` int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); stringConverter.convert(2); // 3 ``` 然而,num在编译的时候被隐式地当做final变量来处理。下面的代码就不合法: ``` int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); num = 3; ``` 在lambda表达式内部企图改变num的值也是不允许的。 #### 访问成员变量和静态变量 与局部变量不同,我们在lambda表达式的内部能获取到对成员变量或静态变量的读写权。这种访问行为在匿名对象里是非常典型的。 ``` class Lambda4 { static int outerStaticNum; int outerNum; void testScopes() { Converter<Integer, String> stringConverter1 = (from) -> { outerNum = 23; return String.valueOf(from); }; Converter<Integer, String> stringConverter2 = (from) -> { outerStaticNum = 72; return String.valueOf(from); }; } } ``` #### 访问默认接口方法 还记得第一节里面formula的那个例子么? 接口Formula定义了一个默认的方法sqrt,该方法能够访问formula所有的对象实例,包括匿名对象。这个对lambda表达式来讲则无效。 默认方法无法在lambda表达式内部被访问。因此下面的代码是无法通过编译的: ``` Formula formula = (a) -> sqrt( a * 100); ```