访问局部变量
我们可以访问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);