对于lambdab表达式外部的变量,其访问权限的粒度与匿名对象的方式非常类似。你能够访问局部对应的外部区域的局部final变量,以及成员变量和静态变量。 

访问局部变量 

我们可以访问lambda表达式外部的final局部变量: 

Java代码 
  1. final int num = 1;  
  2. Converter<Integer, String> stringConverter =  
  3.         (from) -> String.valueOf(from + num);  
  4.    
  5. stringConverter.convert(2);     // 3  

但是与匿名对象不同的是,变量num并不需要一定是final。下面的代码依然是合法的: 

Java代码 
  1. int num = 1;  
  2. Converter<Integer, String> stringConverter =  
  3.         (from) -> String.valueOf(from + num);  
  4.    
  5. stringConverter.convert(2);     // 3  

然而,num在编译的时候被隐式地当做final变量来处理。下面的代码就不合法: 

Java代码 
  1. int num = 1;  
  2. Converter<Integer, String> stringConverter =  
  3.         (from) -> String.valueOf(from + num);  
  4. num = 3;  

在lambda表达式内部企图改变num的值也是不允许的。 

访问成员变量和静态变量 

与局部变量不同,我们在lambda表达式的内部能获取到对成员变量或静态变量的读写权。这种访问行为在匿名对象里是非常典型的。 

Java代码 
  1. class Lambda4 {  
  2.     static int outerStaticNum;  
  3.     int outerNum;  
  4.    
  5.     void testScopes() {  
  6.         Converter<Integer, String> stringConverter1 = (from) -> {  
  7.             outerNum = 23;  
  8.             return String.valueOf(from);  
  9.         };  
  10.    
  11.         Converter<Integer, String> stringConverter2 = (from) -> {  
  12.             outerStaticNum = 72;  
  13.             return String.valueOf(from);  
  14.         };  
  15.     }  
  16. }  

访问默认接口方法 

还记得第一节里面formula的那个例子么? 接口Formula定义了一个默认的方法sqrt,该方法能够访问formula所有的对象实例,包括匿名对象。这个对lambda表达式来讲则无效。 

默认方法无法在lambda表达式内部被访问。因此下面的代码是无法通过编译的: 

Java代码 
  1. Formula formula = (a) -> sqrt( a * 100);  

 

延伸阅读

向着Java前进-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训向着Java前进