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