Java中lambda表达式中的局部变量的规则是什么?
一个拉姆达表达式可以捕获像变量本地和匿名类。换句话说,它们对封闭范围的局部变量具有相同的访问权限。对于lambda表达式中的局部变量,我们需要遵循一些规则。
Lambda表达式无法像匿名内部类一样定义任何新范围,因此我们无法声明与Lambda表达式的封闭范围中已声明的局部变量相同的局部变量。
在lambda表达式内部,我们无法将任何值分配给在lambda表达式外部声明的某些局部变量。因为在lambda表达式外部声明的局部变量可以是final或有效的final。
最终规则或有效最终规则也适用于方法参数和异常参数。
在这个和超级lambda表达式体内引用是与它们的闭合范围。因为lambda表达式无法定义任何新范围。
示例
import java.util.function.Consumer; public class LambdaTest { public int x = 1; class FirstLevel { public int x = 2; void methodInFirstLevel(int x) { Consumer<Integer> myConsumer = (y) -> { // Lambda Expression System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("this.x = " + this.x); System.out.println("LambdaTest.this.x = " + LambdaTest.this.x); }; myConsumer.accept(x); } } public static void main(String args[]) { final LambdaTest outerClass = new LambdaTest(); final LambdaTest.FirstLevel firstLevelClass = outerClass.new FirstLevel(); firstLevelClass.methodInFirstLevel(10); } }
输出结果
x = 10 y = 10 this.x = 2 LambdaTest.this.x = 1